git merge --no-ff和git merge --squash之间的区别是什么

时间:2013-08-22 19:01:46

标签: git merge squash

我正在与一个使用“合并工作流程”的小团队合作,我们最近根据Sandofsky's article切换到了“rebase工作流程”。

我们当前的工作流程:

  1. git checkout master,git pull origin master
  2. git checkout -b feature_branch,做一些工作,git commit -am“msg for feature branch”
  3. git checkout master,git pull origin master,git rebase master feature_branch
  4. git checkout master,git merge --squash
  5. git commit -am“msg for master branch”,git push origin master
  6. 在重新定义要素分支后,我们将其合并到我们的主人中。如果我们使用--no-ff会发生什么? git merge --squashgit merge --no-ff之间有什么区别?

3 个答案:

答案 0 :(得分:2)

--squash创建一个单个提交,其中包含所有合并的更改(将整个合并分支的历史记录压缩到一个提交中)。 --no-ff还合并到一个分支中,创建合并提交并保留合并分支的整个历史记录。

答案 1 :(得分:2)

git merge --squash创建一个提交,应用您对普通merge应用的所有更改。因此,它合并您将在一次提交中为分支带来的所有提交。

git merge --no-ff阻止快进 - 如果源和目标没有发散,只需将分支指针移动到较新的提交即可。因此,使用--no-ff,您保证会有一个新的提交,其父母将是您当前的HEADfeature_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提交的开发的新分支中。