【问题标题】:How can I override the merge-base in a git merge?如何在 git 合并中覆盖合并基础?
【发布时间】:2015-08-17 20:15:35
【问题描述】:

我的存储库已将精选记录记录为合并。它抛出了 git 对合并基础的选择。是否可以指定合并基础?如果有,怎么做?

示例:f 是从 A 的 master 分支出来的。C 被精心挑选到 f,但被误导为与 K 和 C 作为父级的合并。

A-B-C   master
\   \  
 K---C'-L   f

当将 f 合并到 master git 时,会发现 C 是最好的共同祖先并将其用作 Base。由于 B 包含在 Base 中,但在 f 处丢失,它将被合并撤消。使用 A 作为基础将给出正确的合并。

编辑:This answer 排除了下面询问的计划 B。所以,希望有人能回答:如何在 git merge 中指定合并基础?


编辑,B 计划:通过使用 tfs-git 从两个具有cherry-pick-workflow 的 tfs-branches 获取,存储库已经变成了这样。一个变更集的“合并选定范围”在 git 中显示为完全合并。另一种解决方案是以某种方式将 git-tfs 配置为不创建合并提交。 (停止为所有人挑选樱桃是不可能的。)

【问题讨论】:

  • 嗨@Grastveit,我不确定我是否理解您的问题,如果您选择C 但不是B 不是有意的,那么B 是从进一步的工作?如果不应该也选择B,或者在您的示例中只是继续C
  • @florianb:团队中的其他人已经完成了“合并选定范围”并且仅将 C 合并到分支 f 并签入。我已经使用 git-tfs 获取,他们的签入显示为合并在我的 git 存储库中。在 git 中,合并意味着合并所有更改,因此在 C' 中假定包含来自 B 和 C 的更改。更清晰?

标签: git merge git-merge


【解决方案1】:

如何在 git 合并中指定合并基础?

有移植物:

echo $(git rev-parse tip1 mybase) >>.git/info/grafts
echo $(git rev-parse tip2 mybase) >>.git/info/grafts

git checkout tip1
git merge tip2

rm .git/info/grafts

edit 来自评论:使用带注释的标签,在引用的末尾指定 ^{}tip1^{} 等,以便 rev-parse 跟踪并打印提交的 id 而不是开心与标签的。

【讨论】:

  • FWIW echo $(foo) >> filefoo >> file 相同。
  • @amalloy 我想你可能已经忘记了 shell 分词。 . . echo 将两行 rev-parse 输出转换为单行 echo 输出。
  • @amalloy 错字已修复,谢谢。 It really is about wordsplitting,shell 将每个单词作为单独的参数传递给 echo,单词边界由 IFS 变量指定,通常是空格/制表符/换行符。试试(IFS=: ; printf '%s\n' $PATH )
  • 哇哈哈,力量!我使用的是 vanilla cmd,但现在切换到 git bash。我也犯了一个按标签指定基数的小错误。合并失败,因为显然 rev-parse 返回了标签对象的 SHA,而不是提交 SHA。
【解决方案2】:

我认为问题在于“摘樱桃”(以 Git 方式)似乎是 Team Foundation Server 版本控制的没有功能或planned workflow


git 的“cherry-pick”命令应用“[given] commit[s] 在 [...] 分支尖端引入的更改,并使用 [those] 更改创建 [s] 一个新的提交[s]。” (http://git-scm.com/docs/git-cherry-pick)

TFSVSC 没有“樱桃采摘”命令,但可以执行“合并 [a] 选定范围”或“部分合并”,将指定的(后续)变更集合并到不同分支上的新变更集(@ 987654323@)。

这就是git-tfs 似乎达到极限的地方(在撰写本文时)-Invalid selective merges instead of cherry picks。 (目前)似乎没有故障安全方法可以将部分合并转换为相应的 git-cherry-picks,其中 git-merge 提供错误的结果,因为 Git 基于快照(因此需要依赖树)与基于 TFS 的差异在变更集上。


我目前认为你必须等到 git-tfs 的问题得到修复,或者在 git-repository 中进行挑选。另一种方法是检查 tfs-repository 并将其提交到 git-repo,但这会在传输过程中关闭您的提交历史记录。

【讨论】:

  • 感谢您提供明确排除“计划 B”作为解决方案的好答案。这就留下了指定合并基础作为使其工作的方式。我等会儿看看……
猜你喜欢
  • 2012-12-25
  • 2017-03-23
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多