为什么`git merge <branch> --squash`没有提交?

时间:2018-05-22 19:52:33

标签: git merge branch commit squash

进行正常合并时,例如git merge <branch>git创建合并提交,并将当前分支的HEAD更新为该提交。

进行压缩合并时,例如git merge <branch> --squash但是,它没有提交,说(在一个干净的合并上):

Squash commit -- not updating HEAD
Automatic merge went well; stopped before committing as requested

这背后的理由是什么?对我来说,这似乎是普通合并和壁球合并之间的意外差异。如果正常合并和壁球合并之间的唯一差异是壁球合并压缩提交,那对我来说会更直观。

3 个答案:

答案 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中,却忘记了这样做。它不会更新,因为所做的更改和母版相同。

希望这个答案可以帮助某人比我少浪费时间。