恢复合并保持决议
Revert merges keeping resolutions
在我们的团队中,我们正在应用 git 没有拉取请求的流程,也就是说,我们每个人都在自己的分支中开发功能,这些功能从开发开始,一旦完成,它们就会合并到开发中。我们的工作流程是:
- 拉动开发
- 开发中的分支功能/[名称]
- 在该分支中开发该功能
- 回去开发,拉开发
- 合并完成的特征
- 解决可能的冲突
- 推动发展
然而,有时会发生两个开发人员同时完成一项功能的情况。现在,假设两个开发人员有合并冲突。第一个推送 develop 的人会更新 origin 的 develop,所以当另一个人尝试推送时,它将失败,因为他们已经分道扬.
现在,我们不希望第二个开发人员从 develop 中拉出来并合并两者...因为它打破了 "beauty" 只有一个具有 branching/merging 功能的 develop 分支但是然后有2个开发分支。我们现在所做的是将本地开发重置为 origin/develop 并重复 merge/finish 功能,但如果合并冲突难以解决,我们必须再次执行此操作。
在图片中,我们有这个:
我想重复上次合并,但是 origin/develop 不需要手动解决我遇到的冲突。我知道我可能有新的合并冲突,但我不想重复我已经解决的冲突。
它看起来像一个 rebase --preserve-merged,但它不保留合并决议....
调整您的工作流程应该可以解决这个问题。不是将 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
与其他人推送的内容保持同步。
rerere
就是你要找的;启用后,它会记住您如何解决合并冲突,并且当它看到相同的冲突时,会自动为您解决它们。使用 git config --global rerere.enabled true
启用它。您可以阅读更多相关信息 here。
在我们的团队中,我们正在应用 git 没有拉取请求的流程,也就是说,我们每个人都在自己的分支中开发功能,这些功能从开发开始,一旦完成,它们就会合并到开发中。我们的工作流程是:
- 拉动开发
- 开发中的分支功能/[名称]
- 在该分支中开发该功能
- 回去开发,拉开发
- 合并完成的特征
- 解决可能的冲突
- 推动发展
然而,有时会发生两个开发人员同时完成一项功能的情况。现在,假设两个开发人员有合并冲突。第一个推送 develop 的人会更新 origin 的 develop,所以当另一个人尝试推送时,它将失败,因为他们已经分道扬.
现在,我们不希望第二个开发人员从 develop 中拉出来并合并两者...因为它打破了 "beauty" 只有一个具有 branching/merging 功能的 develop 分支但是然后有2个开发分支。我们现在所做的是将本地开发重置为 origin/develop 并重复 merge/finish 功能,但如果合并冲突难以解决,我们必须再次执行此操作。
在图片中,我们有这个:
我想重复上次合并,但是 origin/develop 不需要手动解决我遇到的冲突。我知道我可能有新的合并冲突,但我不想重复我已经解决的冲突。
它看起来像一个 rebase --preserve-merged,但它不保留合并决议....
调整您的工作流程应该可以解决这个问题。不是将 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
与其他人推送的内容保持同步。
rerere
就是你要找的;启用后,它会记住您如何解决合并冲突,并且当它看到相同的冲突时,会自动为您解决它们。使用 git config --global rerere.enabled true
启用它。您可以阅读更多相关信息 here。