是的,是的。
你可以在 git 中以任何你喜欢的方式合并。合并只是意味着“结合这些历史”。当 git 不能时,它的默认模式只是将更改转储给您,即“合并冲突”,但您也可以更改该行为以倾向于“我们的”或“他们的”。查看git-merge 文档,了解数百个选项的完整说明...
因此,根据您的解释,历史图表可能如下所示:
*-------*-------*------* master
|
*----*-----* A
|
*-------* B
|
*----* C
* 只是该分支上的一些提交,除了它们都被创建的地方。那么你如何解决这个问题呢?好吧,我会:
git checkout A
在 A 上,基本上我们要像这样将 A 合并到 master 中:
git merge master
这样做有充分的理由 - 当呈现给另一个开发人员时,假设合并是准确的,这对他们来说代表了一个简单的快进合并。换句话说,将 A 合并到其他人存储库中的实际主服务器中,这变得更容易了。现在,您或其他开发人员可以执行的下一步:
git checkout master && git merge A
这拉入了A。它应该基本上没有合并冲突,因为将master合并到A的过程解决了它们,并且负责集成A的开发人员处理了它。
那么
git checkout B && git merge master
再次解决合并问题,然后git checkout master && git merge B
最后,你是说我可以将master 合并到 C 中吗?绝对地。我们刚刚完成了两次该过程。
我们在工作中使用这种特殊的做事方式。基本上,我让其他开发人员让我知道他们的分支何时准备就绪,然后我将它们合并,然后每个人将 master 合并到他们的分支中,然后重复该过程。您甚至可以使用远程存储库执行此操作。如果您在远程中有跟踪分支,git pull 会提取您的更改。这实际上是一个git fetch,后跟一个git merge,所以如果你没有跟踪别人的分支,你仍然可以像这样应用合并:
他们可以使用git merge leaddeveloper/master,其中leaddeveloper 是一个远程名称。然后他们可以纠正任何冲突,向首席开发人员发送电子邮件说“请拉”,然后首席开发人员可以输入 git fetch && git merge juniordeveloper1/somebranch 或更可能是 git fetch && git diff master..juniordeveloper1/somebranch 来确定他们首先做了什么。
简而言之,我认为这是管理项目的一种非常好的方式。它使每个人都保持最新状态,并确保处理主要 master 的人也没有集成代码的工作。
关于 git rebase 的问题,this question 处理得非常巧妙。