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

哪一个应该用来隐藏微提交?

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

差异

这些选项存在于不同的目的。 您的存储库结束了不同。

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

在这里输入图像说明

--squash

如果你签出master,然后git merge --squash topic; git commit -m topic git merge --squash topic; git commit -m topic ,你得到这个:

在这里输入图像说明

--no-ff --no-commit

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

在这里输入图像说明

隐藏微提交

如果你真的想隐藏(我的意思是从你的仓库中删除 )你的微提交,使用--squash 。 因为,正如你在上面的图片中看到的,如果你不挤压你的话,你并不是真的隐藏你的微型提交。 而且,你通常不会把你的主题分支推向世界。 主题分支是主题变得成熟。

如果你希望你的历史能够拥有所有的微型提交,但是把它们放在另一个开发线(上图中的绿线),可以使用--no-ff --no-commit 。 但请记住,a)这不是一个分支,b)在Git中并不意味着什么,因为它只是提交的另一个父项。

如果你真的想理解,请参阅Git分支 – 分支是什么 。