问题在于git-flow方法
的一些边缘情况我有这样一种典型的git-flow历史:
o---o---o---o [release-3.5.0]
/
----o---o---o---o---o [development]
Git-flow告诉我们将 release-3.5.0 分支合并到开发,然后发布就绪了。因此,最终我们将在发布分支处进行所有更改。
o---o---o---o
/ \
----o---o---o---o---o [development]
现在想象一下,我们在发布分支上有一个提交'X',我们不想想要在开发分支上,例如它是某种黑客/修补程序,或者已经在开发中修复了以更健全的方式(即通过提交Y)
o---X---o---o [release-3.5.0]
/
----o---o---o---Y---o [development]
那么,主要问题是如何处理这种情况?如何防止这个提交(或提交)重新开发?
答案 0 :(得分:7)
虽然推荐rebase
和/或merge / revert / squash的答案会有效,但我个人认为更好的答案是:
git checkout development
git merge --no-commit release-3.5.0
# make whatever changes you need to fixup the "hack" and/or clean up any conflicts
git commit
答案 1 :(得分:3)
在这种情况下,始终希望完全合并发布(类似)分支。所以要确保没有遗漏任何东西。
但在合并期间,您可以自由修改内容 - 包括删除或重做某些更改。对于您的示例案例,合并分支,还原您不喜欢的提交,并压缩恢复到合并提交。显然在该操作的合并提交消息中做了注释。
如果修复程序已在devel上,则merge将跳过它,或者您可以通过选择devel版本来解决冲突。
关键是你希望历史展示作为你的第二个数字,以及最合适的状态。
答案 2 :(得分:1)
您有几种选择:
1)使用git rebase -i
在此模式下,您可以在开发分支上重新定义发布分支并排除第X次提交。
警告在这种情况下,您将弄乱现有的克隆存储库。
2)使用git cherry-pick
在这种模式下,您可以逐个选择提交。
3)在单独的分支上使用git rebase -i
并在之后合并,如本答案中所述:Is it possible to exclude specific commits when doing a git merge?