应该使用哪一个来隐藏微提交?
git merge --squash
和 git merge --no-ff --no-commit
之间的唯一区别是其他父母的否认吗?
差异
这些选项存在用于不同目的。您的存储库最终会有所不同。
假设您在主题分支上完成开发后,您的存储库是这样的:
https://i.stack.imgur.com/cbPxa.png
- 壁球
如果您结帐 master 然后 git merge --squash topic; git commit -m topic
,您会得到:
https://i.stack.imgur.com/4qDmI.png
--no-ff --no-commit
相反,如果您执行 git merge --no-ff --no-commit; git commit -m topic
,您会得到:
https://i.stack.imgur.com/BLiIy.png
隐藏微提交
如果您真的想隐藏(我的意思是从您的存储库中删除)您的微提交,请使用 --squash
。因为,正如您在上面的图片中看到的那样,如果您不进行压缩,您并没有真正隐藏您的微提交。此外,您通常不会将您的主题分支推向世界。主题分支是为了让主题变得成熟。
如果您希望历史记录包含所有微提交,但将它们留在另一条开发线(上图中的绿线),请使用 --no-ff --no-commit
。但请记住,a) 这不是一个分支,并且 b) 在 Git 中没有任何意义,因为它只是您提交的另一个父级。
如果您真的想了解,请参考Git Branching - What a Branch Is。
-no-ff
的目的不是 隐藏微提交吗? -> stackoverflow.com/a/2850413/321973--no-ff
是告诉 git “即使可以,也不要先转发。而是创建一个合并提交并重用所有现有提交。”--no-ff
保留该拆分--squash
所做的。是的,您可以在开发行中隐藏您的微提交,但这并不意味着如上所述的另一个分支。因为您正在将开发分支合并到主分支,所以它将不再是一个单独的 分支。-no-ff --no-commit
不会隐藏微提交的存在,而--squash
会”,这是唯一的区别,我会接受这个答案