进行正常合并时,例如git merge <branch>
,git
创建合并提交,并将当前分支的HEAD
更新为该提交。
进行压缩合并时,例如git merge <branch> --squash
但是,它没有提交,说(在一个干净的合并上):
Squash commit -- not updating HEAD
Automatic merge went well; stopped before committing as requested
这背后的理由是什么?对我来说,这似乎是普通合并和壁球合并之间的意外差异。如果正常合并和壁球合并之间的唯一差异是壁球合并压缩提交,那对我来说会更直观。
答案 0 :(得分:2)
这背后的理由是什么?
草稿合并提交消息将包含来自其他分支的所有压缩消息。像这样:
Squashed commit of the following:
commit 2fb77b77f813501ae2c8159e7bf751c216572a57
Author: Your Name <you@example.com>
Date: Tue May 22 22:47:50 2018 +0200
Drop baz
commit 894f1ef07af29d25c4716dce9db4402032f854d4
Author: Your Name <you@example.com>
Date: Tue May 22 22:47:39 2018 +0200
Fix bar
commit 7f60998ab1949e9e8db9229f9ef9e7c0333cd04f
Author: Your Name <you@example.com>
Date: Tue May 22 22:47:19 2018 +0200
Add foo
通常,您需要在提交之前自定义该消息。
如果您对可以执行的默认消息感到满意:
git merge <branch> --squash && git commit --no-edit
答案 1 :(得分:1)
这种为什么问题确实必须首先发送给编写命令的人;只有他们真的知道。
底层实现是懒惰的:它通过与常规合并相同的代码路径,但跳过编写文件MERGE_HEAD
,然后提前退出以避免通过将进行合并提交的代码。
如果使用--no-commit
选项,则代码几乎完全相同。事实上,控件变量为option_commit
,设置--squash
会清除option_commit
,就像您使用--no-commit
一样。
如果--squash
没有清除option_commit
,则现有路径似乎会抱怨自动登记失败。所以可能只是懒惰。
答案 2 :(得分:0)
好吧,如果您像我一样,问题是您已经将该分支合并到master中,却忘记了这样做。它不会更新,因为所做的更改和母版相同。
希望这个答案可以帮助某人比我少浪费时间。