ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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


M
Multinerd

差异

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

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

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 会”,这是唯一的区别,我会接受这个答案