Git:如何合并一个很小但非常旧的分支?

8
我们正在从SVN迁移,并合并一堆分支。为了大大简化,我们有一个分支B,它很久以前就被分叉出来,只有少量的开发,比如说修改了8个文件,而这些文件只是数百个文件中的一小部分。与此同时,在主分支上发生了巨大的变化。
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的话 - 请随便指出。 :))

1
你尝试过创建一个补丁来连接这两个分支,然后将其应用到当前的主干上吗? - Adrian Cornish
你是指在X和B之间吗?那听起来就是我想做的。你能告诉我正确的命令吗? - Steve Bennett
1
根据您的需要,以下是一些示例:git diff X..HEAD foo.cc > foo.patch 或 git diff X..HEAD > all.patch。 - Adrian Cornish
通过简单地反向阅读“git log”,回答了上面的“1.”。 - Steve Bennett
@Adrian,看起来这个会起作用。我注意到一个缺点是当你应用补丁时,你失去了像mergetool这样的工具的访问权限 - 有时补丁会失败。 - Steve Bennett
显示剩余3条评论
2个回答

2

从B和master分叉的点创建一个名为“X”的新分支,然后将B合并到X中是无济于事的。那只是一次快进式合并;合并B到主分支中造成的冲突会没有任何改变. 您唯一的选择是将B合并到master分支并解决冲突。冲突就是冲突,没有“绕过”它们的方法。


最终我认为你是对的,这也是我采取的方法。好的工具会帮助很多。奇怪的是,Eclipse(至少是PyDev)中的冲突解决工具比通用的Mac“opendiff”差。不过,要管理那么多的冲突并确保没有遗漏是相当困难的。好的测试用例也会有所帮助,我想。 - Steve Bennett
@SteveBennett: 测试确实很好,但只能做到这一步,因为如果你合并一个非常旧的提交,它添加的任何测试可能不再完整,它改变的任何测试可能会以错误的方式被更改。 - Cascabel
有时候,将旧分支基于主分支进行变基可能更容易。这样,您只需要处理每个旧提交的合并冲突,而不是因为单个合并而导致所有旧提交的巨大冲突。 - Mikko Rantalainen
或者你可以使用类似BeyondCompare这样的工具,手动进行比较? - Radu

1

如果情况够糟糕,你可能想要手动重新编写针对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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接