【问题标题】:Git: How to merge a small, but very old branch?Git:如何合并一个很小但很老的分支?
【发布时间】:2012-02-06 13:47:19
【问题描述】:

我们正在从 SVN 迁移,并且还合并了一堆分支。为了大大简化,我们有一个很久以前分叉的分支 B,并且有一点开发,比如说修改了数百个文件中的 8 个文件。同时,master也发生了巨大的变化:

A 
|
X---(a few changes)--- B
|
|(hundreds of changes)
|
HEAD/master 

如果我从分支执行“git merge master”,则会显示许多合并冲突,因为 B 和 HEAD 现在非常不同。但这似乎(天真地,对我来说)是错误的:B 离后备箱不远,只是回到了很长一段时间。

有没有办法利用这个事实?我是否应该尝试先将 B 合并回 X,然后从那里合并到 HEAD?什么是命令:

  1. 标识修订版 X
  2. 查看 B 和 X 之间的差异
  3. 将 B 与 X 合并
  4. 从新的合并版本更新到 HEAD

人们在这些情况下使用的另一种方法吗?

(很可能我在前面说了一些非常愚蠢和不像 git 的东西 - 请随时指出它们。:))

【问题讨论】:

  • 您是否尝试过在两个分支之间创建补丁并将其应用于您当前的头部。
  • 你的意思是X和B之间?这听起来像我想要做的。你能指点我正确的命令吗?
  • 取决于最适合你的几个例子可能是 git diff X..HEAD foo.cc > foo.patch 或 git diff X..HEAD > all.patch
  • 回答“1”。只需通过“git log”向后阅读即可。
  • @Adrian,看起来这行得通。我注意到一个缺点是当您应用补丁时,您将无法访问像 mergetool 这样的工具 - 有时补丁会失败。

标签: git svn merge branch


【解决方案1】:

从 B 和 master 分歧的点创建一个新的分支“X”,然后将 B 合并到 X 对你没有帮助。那只是一个快进合并;将 B 合并到 master 所引起的冲突实际上没有变化。您唯一的选择是将 B 合并到 master 并解决冲突。冲突就是这样,没有办法“绕过”它们。

【讨论】:

  • 是的,最后我认为你是对的,这就是我采取的方法。好的工具会有很大帮助。奇怪的是,Eclipse 中的冲突解决工具(好吧,无论如何是 PyDev)不如通用的 Mac“opendiff”好。但是,要管理这么多冲突并确保不会丢失任何东西是非常困难的。我猜,好的测试用例也会有所帮助。
  • @SteveBennett:测试确实很棒,但仅此而已,因为如果您要合并一个非常旧的提交,它添加的任何测试都可能不再完整,它更改的任何测试都可能是以错误的方式更改。
  • 有时将旧分支重新设置在 master 之上可能更容易。这样,您必须处理每个旧提交的合并冲突,而不是处理由于单个合并而由所有旧提交引起的巨大冲突。
  • 或者您可以使用 BeyondCompare 之类的工具并手动操作?!
【解决方案2】:

如果它够糟糕,您可能只想手动重写 HEAD 的补丁或至少一个更新的版本。这不仅有助于处理冲突,并为您留下您可能会更喜欢的历史记录,而且还可以帮助您避免 合并冲突一部分的错误。由于更改下的代码更改,存在相当多的潜在问题,并且并非所有问题实际上都会表现为合并冲突。

也就是说,如果您确实想尝试仅以合并方式进行,您将不得不以一种或另一种方式处理这些冲突。 有可能你可以通过渐进式的方式来减轻自己的痛苦,并以较小的增量及时向前迈进。我可以通过逐步改变分支向前来做到这一点:

git rebase version-2 old-branch
# deal with conflicts if they happen
git rebase version-3 old-branch
# and so on...
# until old-branch is based on a recent version
git checkout master
git merge old-branch

这将有效地让您在每个步骤中处理较小的更改,而不是一次处理所有更改。

【讨论】:

    猜你喜欢
    • 2012-09-20
    • 2021-12-05
    • 1970-01-01
    • 2018-07-27
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    相关资源
    最近更新 更多