Git:如何合并一个很小但很老的分支?

Git:如何合并一个很小但很老的分支?,git,svn,merge,branch,Git,Svn,Merge,Branch,我们正在从SVN迁移,同时也合并了一些分支。为了大大简化,我们有一个分支B,它在很久以前就已经分叉了,并且进行了一些开发,比如说修改了数百个文件中的8个文件。与此同时,master发生了巨大的变化: A | X---(a few changes)--- B | |(hundreds of changes) | HEAD/master 如果我从分支执行“git merge master”,会显示许多合并冲突,因为B和HEAD现在非常不同。但这似乎(天真地,对我来说)是错误的:B离主干不远,只

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

A 
|
X---(a few changes)--- B
|
|(hundreds of changes)
|
HEAD/master 
如果我从分支执行“git merge master”,会显示许多合并冲突,因为B和HEAD现在非常不同。但这似乎(天真地,对我来说)是错误的:B离主干不远,只是回到了很久以前

有没有办法利用这一事实?我应该先把B合并回X,然后再从X合并到头部吗?以下命令是什么:

  • 确定修订版X
  • 参见B和X之间的区别
  • 将B与X合并
  • 从新合并版本更新到HEAD
  • 在这些情况下,有没有其他方法可以使用


    (很可能我在前面已经说过一些非常愚蠢和不正确的事情-请随意指出。:)

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

    如果冲突够严重,您可能只需要针对HEAD或至少是更新版本手动重写补丁。这不仅有助于处理冲突,并为您留下您可能更喜欢的历史记录,而且还可以帮助您避免不属于合并冲突的bug。由于更改下面的代码更改,有相当多的潜在问题,并且并非所有问题都会以合并冲突的形式出现

    这就是说,如果你真的想尝试以merge-y的方式来做这件事,你必须以这样或那样的方式来处理这些冲突。你可以通过循序渐进的方式来减轻自己的痛苦,在时间上以较小的增量前进。我可以通过逐步重新调整分支的前进方向来实现这一点:

    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
    

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

    您是否尝试过在两个分支之间创建一个补丁,并将其应用到您当前的头部。您的意思是在X和B之间?这听起来像是我想做的。你能给我指出正确的命令吗?根据最适合你的命令,有两个例子可能是git diff X..HEAD foo.cc>foo.patch或git diff X..HEAD>all.patch,回答为“1”。上面只需通过“git log”反向阅读即可。@Adrian,看起来这会奏效。我注意到一个缺点是当你应用补丁的时候,你会失去对像mergetool这样的工具的访问,有时候补丁会失败。是的,最后我认为你是对的,这就是我采取的方法。好的工具会有很大帮助。奇怪的是,Eclipse中的冲突解决工具(无论如何,PyDev)不如通用Mac“opendiff”好。然而,要管理这么多的冲突,确保没有损失,这是非常困难的。好的测试用例也会有所帮助,我想。@SteveBennett:测试确实很棒,但只是到目前为止,因为如果合并一个非常旧的提交,它添加的任何测试都可能不再完整,它更改的任何测试都可能以错误的方式更改。有时,在主服务器上重新设置旧分支的基础可能更容易。这样,您必须处理每次旧提交的合并冲突,而不是处理由于一次合并而导致的所有旧提交产生的巨大冲突。或者您可以使用BeyondCompare之类的工具手动执行?!