我正在与一个使用“合并工作流程”的小团队合作,我们最近根据Sandofsky's article切换到了“rebase工作流程”。
我们当前的工作流程:
在重新定义要素分支后,我们将其合并到我们的主人中。如果我们使用--no-ff会发生什么? git merge --squash
和git merge --no-ff
之间有什么区别?
答案 0 :(得分:2)
--squash
创建一个单个提交,其中包含所有合并的更改(将整个合并分支的历史记录压缩到一个提交中)。 --no-ff
还合并到一个分支中,创建合并提交并保留合并分支的整个历史记录。
答案 1 :(得分:2)
git merge --squash
创建一个提交,应用您对普通merge
应用的所有更改。因此,它合并您将在一次提交中为分支带来的所有提交。
git merge --no-ff
阻止快进 - 如果源和目标没有发散,只需将分支指针移动到较新的提交即可。因此,使用--no-ff
,您保证会有一个新的提交,其父母将是您当前的HEAD
和feature_branch
头。
当你log
这两种情况时,在第一种情况下,您只会看到一行提交,每一次提交都是feature_branch
摘要,而在第二种情况下一个你会看到很多分支,每个feature_branch
一个,并且再次加入master
。
当git merge --squash
根据feature_branch
生成提交时,它们是不同的提交,因此如果您单独发布feature_branch
,则可能会遇到问题 - 例如,您可以{{1多次没有git merge --squash feature_branch
理解它,但你会有冲突。
答案 2 :(得分:0)
最大的区别在于您的分支历史。使用--squash,您将拥有一个线性分支历史记录,其中分支上的每个提交都包含该提交的合并所执行的所有更改。使用--no-ff,您将拥有一个不同的分支历史记录,其中包含两个分支与多个父项一起出现的合并提交,并且父提交将包含所做的实际更改。
就个人而言,我更喜欢使用--squash方法,因为它更容易识别变更的来源(因为更改是在实际的压缩提交而不是父提交)。缺点是它是一个唯一的提交而不是提交历史记录,因此如果您继续在该分支上进行开发并执行另一次压缩提交,您将获得另一个提交,其中包含该分支的整个更改历史记录。这可以使识别变更的位置变得更加困难,因为在两个不同的提交中可能会出现相同的变化。对此的解决方案是在执行压缩提交后删除分支,并且任何更改或改进都应该在包含其历史记录中的squash提交的开发的新分支中。