git version 1.7.5.4
我有大约5个分支机构。全部来自同一个初始分支。
我想合并两个分支。比如,branch1和branch2。这些分支有很多不同之处。
我目前正在研究branch1,并且刚刚意识到我在branch2中实现了一些我希望在branch1中实现的更改。
合并的最佳方式是什么?
checkout branch2 and merge branch1
或
checkout branch1 and merge branch2
或者,您需要签出哪个分支以与另一个分支合并,这不重要吗?
答案 0 :(得分:17)
通常,如果两个分支都是主题分支或功能分支,则无关紧要。
但是,如果您有一个集成分支或标记已发布内容的分支,您肯定希望使用长期集成分支作为签出的分支并将另一个分支合并到其中。
这样做的原因是合并提交会将第一个父提交标记为来自主分支的提交。现在,您对该分支的历史记录的树形规范很容易。要查找此分支中第4个最后的提交,您只需
git show head~4
如果你从中间的某个地方合并了另一个分支,那么你必须在其他地方完成合并的地方显式切换到第二个提交:
git show head^^2^^
由于其他原因,这可能会导致主要分支出现问题;将它们合并到主题或功能分支中称为“反向合并”并不是一个好主意。我记得当贡献者做到这一点时,Linus Torvalds吹响了他的顶峰。它不允许他干净地分离他想要合并的主要版本的功能,因为功能分支会带来旧的测试合并,其中包括他不再需要的东西。
所以最后,如果一个分支更重要并且不仅仅是一个功能,请检查它并从那里合并。您将能够轻松地查看历史记录,因为您知道它的第一个父级始终是该分支之前的位置。如果你不这样做,你将不得不依赖于阅读合并提交消息,而这并不是那么有趣。 :)
我写过一篇关于BpF的文章,该文章展示了一种严格保持分支机构组织的方法:http://dymitruk.com/blog/2012/02/05/branch-per-feature/
答案 1 :(得分:3)
我假设你真的希望合并整个分支,而不仅仅是挑选奇怪的提交。另外,我在下面说的很大程度上基于这个very helpful blog post by Junio C. Hamano,git维护者,如果你想了解更多关于分支的哲学,我强烈建议你阅读。
不幸的是,你的问题中没有足够的信息来提供关于此的合理建议,因为问题主要取决于每个分支的目的。例如,在一个常见场景中,可能有一个master
分支,其中一个应始终能够从中生成稳定版本。当有人想要为软件添加新功能时,他们可能会创建一个名为awesome-feature
的主人的主题分支,他们可以使用这些主题分支,可能是变基,彻底测试等等。当每个人都对该分支感到满意时,只有将awesome-feature
合并到master
才有意义,而不是相反。 (另一种方式,大约是,大师中的所有东西都有助于实现主题分支所用的“真棒特征”。)但是,你只能知道哪个方向是正确的,因为我们知道每个分支的目的
分支和合并在git中非常简单,它支持许多不同的工作流程,从highly structured到rather simpler,到完全非结构化。通过“完全非结构化”,我的意思是有几个不同的发展分支,人们以任何方式合并它们似乎包括他们想要在特定分支中的特征 - 如果你处于这样的情况,那里没有明确的每个分支的定义目的,将branch1
合并到branch2
或反过来可能无关紧要。但是,我发现为每个分支设置更明确的目的会更有帮助,在这种情况下,合并两个分支的方式很重要。