`--squash`和`--no-ff --no-commit`之间有什么区别?

Tob*_*ler 60 git merge git-merge squash fast-forward

应该使用哪一个来隐藏微观发现?

git merge --squashgit merge --no-ff --no-commit否认其他父母的唯一区别?

Yas*_*oji 59

差异

这些选项存在于不同的目的.您的存储库最终会有所不同

在完成主题分支的开发之后,假设您的存储库是这样的:

在此输入图像描述

--squash

如果你结账大师然后git merge --squash topic; git commit -m topic,你得到这个:

在此输入图像描述

--no-ff --no-commit

相反,如果你这样做git merge --no-ff --no-commit; git commit -m topic,你得到这个:

在此输入图像描述

隐藏微提交

如果您真的想隐藏(我的意思是从您的存储库中删除)您的微提交,请使用--squash.因为,正如您在上面的图像中所看到的,如果您不进行压缩,则不会隐藏您的微提交.此外,您通常不会将您的主题分支推向全世界.主题分支是主题成熟.

如果您希望历史记录包含所有微提交,但将它们留在另一个开发线(上图中的绿线),请使用--no-ff --no-commit.但是请记住a)这不是一个分支,而b)并不是Git中的任何意思,因为它只是你提交的另一个父.

请参考Git分支 -如果你真的想要了解,那么分支是什么.

  • 不,`--no-ff`是告诉git"即使可以,也不要先转发.而是创建合并提交并重用所有现有的提交." (5认同)
  • “-no-ff”的目的不是为了隐藏微提交吗?-> http://stackoverflow.com/a/2850413/321973 (2认同)
  • 你的意思是_快_前进?当然它会使用提交,但是如果您查看合并到的分支的历史记录,您将不会在其 _own_ 历史记录中看到微提交,而只会看到另一个分支(包含这些提交)已被合并,而一个快进合并(如果可能)将简单地将微提交重新分配到分支中,使历史看起来好像两个分支自原始拆分以来尚未分离,而 `--no-ff` 保存该拆分 (2认同)
  • 喔好吧。我认为“隐藏”到“从整个孔隙率历史中删除”,因为那是“-南瓜”所做的。是的,您可以在开发线中“隐藏”微提交,但这并不意味着如上所述的“另一个分支”。因为您要将开发分支合并到主分支,所以它不再是单独的_branch_。 (2认同)
  • 好的,那么我们也以同样的方式理解它,但我误解了你"隐藏"的含义,对不起.因此,如果您将其改为"-no-ff --no-commit"并不会隐藏微提交的_existence_,而`--squash`会这样做,那就是唯一的区别,我会接受这个答案 (2认同)