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


Answers:


66

差异

这些选项的存在是为了分开的目的。您的存储库最终以不同的方式结束。

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

在此处输入图片说明


--squash

如果先结帐master,然后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分支-什么是分支


1
不是目的-no-ff,以皮微提交?-> stackoverflow.com/a/2850413/321973
Tobias Kienzler 2012年

5
--no-ff是告诉git“即使可以也不要先转发。而是创建一个合并提交并重用所有现有的提交。”
Yasushi Shoji 2012年

1
你是说进?当然,它将使用提交,但是如果您查看合并到的分支的历史记录,您将看不到其自身历史记录中的微型提交,而仅看到另一个分支(包含这些提交)已被合并,而快速合并(如果可能的话)将只是将微提交重新设置到分支中,使历史看起来好像两个分支自原始拆分以来就没有分离,而--no-ff保留了拆分
Tobias Kienzler 2012年

2
喔好吧。我认为“隐藏”到“从整个孔隙率历史中删除”,因为那样--squash做。是的,您可以微提交隐藏在开发行中,但这并不意味着如上所述的另一个分支。由于您要将开发分支合并到主分支,因此它将不再是单独的分支
Yasushi Shoji 2012年

3
好的,那么我们以同样的方式理解它,但是我误会了您对“隐藏”的含义。因此,如果您将其改写为“-no-ff --no-commit不会隐藏微提交的存在,而--squash确实存在”,那是唯一的区别,那么我会接受这个答案
Tobias Kienzler 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.