在我们的团队中,我们正在应用git flow而没有pull请求,也就是说,我们每个人都在自己的分支中开发功能,这些功能从开发开始,一旦完成,它们就会合并到开发中。我们的工作流程是:
然而,有时候两位开发人员在同一时间完成一项功能。现在,想象两个开发人员有合并冲突。推动发展的第一个将更新原点的发展,所以当另一个试图推动时,它将失败,因为它们已经分歧。
现在,我们不希望第二个开发人员从开发和合并两个开始......因为它打破了只有一个开发分支的“美”,它具有从中分支/合并的功能,但后来有2个开发分支。我们现在所做的是将本地开发重置为origin / develop并重复合并/完成功能,但如果合并冲突难以解决,我们必须再次进行。
我想重复最后一次合并,但是使用origin / develop而不必手动解决我遇到的冲突。我知道我可能会遇到新的合并冲突,但我不想重复我已经解决的问题。
它看起来像一个rebase --preserve-merged,但这不会保留合并解析....
答案 0 :(得分:2)
对您的工作流程进行调整可以解决此问题。不要将feature
合并到develop
,而是将feature
重新绑定到develop
。如果develop
向前爬行,那么feature
分支的工作仍然完成:它们只需要在新分支之上进行重组。你总是试图在develop
分支的尖端上工作。这使事情变得更加简单。
这是一个例子。这是两个开发人员准备合并的状态。他们都更新了develop
。
A - B - F [origin/develop] [develop]
\
C - D - E [feature/1]
A - B - F [origin/develop] [develop]
\
Z - X - Y [feature/2]
他们都是git rebase develop
。 (这将产生新的提交ID,但我在这些图中重用相同的ID以显示提交内容的连续性)。
[origin/develop] [develop]
A - B - F - C - D - E [feature/1]
[origin/develop] [develop]
A - B - F - Z - X - Y [feature/2]
为了保留历史记录中分支的存在,它们都进行合并但使用--no-ff
。 git checkout develop; git merge --no-ff feature/X
这实际上并没有合并,而是形成了一个很好的功能泡泡,这对后来的代码考古学有用,可以理解哪一系列提交是作为单个特征一起完成的。
[origin/develop]
A - B - F - C - D - E [feature/1] [develop]
\ /
----------
[origin/develop]
A - B - F - Z - X - Y [feature/2] [develop]
\ /
----------
然后他们都推,但第一个开发者首先到达那里。第二个推送被拒绝,因此第二个开发者更新develop
。
A - B - F - C - D - E [feature/1] [origin/develop] [develop]
\ /
----------
Z - X - Y [feature/2]
/
A - B - F - C - D - E [origin/develop] [develop]
\ /
----------
没问题,第二个开发人员重复这个程序。他们重新加入develop
。这只需要解决与feature/1
的新提交冲突。
A - B - F - C - D - E - Z - X - Y [feature/2]
\ / [origin/develop] [develop]
----------
然后git checkout develop; git merge --no-ff feature/2; git push
。
---------
/ \
A - B - F - C - D - E - Z - X - Y [feature/2]
\ / [origin/develop] [develop]
----------
最后两位开发者都删除了他们的本地分支机构。历史泡沫和合并点将保留其信息以供历史使用。
这是过程。
develop
。
git checkout develop
git pull --rebase
develop
。
git checkout feature
git rebase develop
git checkout develop
git merge --no-ff feature
develop
。feature
。在feature
开发过程中,可以安全地重复步骤1到3,以使feature
与其他人推动的内容保持同步。
答案 1 :(得分:0)
rerere
正是您所寻找的;启用后,它会记住您是如何解决合并冲突的,当它看到相同的冲突时,会自动为您解决这些冲突。使用git config --global rerere.enabled true
启用它。您可以阅读更多相关信息here。