如果使用 --no-commit,合并失败或中止,如何生成 git merge --log 消息?

How to generate the git merge --log message if using --no-commit, merge fails or is aborted?

我正在执行两个分支的 git merge 并想包括 --log 开关,但忘记了。我中止了提交消息编辑器以重试。

现在我处于 MERGE_HEAD 存在的情况,所以我无法重新运行合并,我被指示 "Please, commit your changes before you can merge."

提交完成合并时,我找不到创建与从 merge --log 开关获得的相同消息的选项。

问:解决方案是删除 .git/MERGE_HEAD 然后再次合并,还是 git commitgit fmt-merge-msg 的某种组合会生成类似日志的消息?

我认为这可能是一个常见问题,但我无法通过 git-smc、Google 或 SO 找到解决方案。

一般来说,如果您开始合并并最终决定不想要它,只需使用 git merge --abort。 (然后您可以使用不同的选项重新启动它。)

不过,如果你确实做了一些工作,你可以只收集提交主题消息(就像你建议的那样,例如,使用 git fmt-merge-msg,或者只使用 git log --format=' %s' -n <num> branch)和将它们放入您 git commit 合并时所做的最终合并中。

我以前从未使用过 git fmt-merge-msg --log,但它似乎希望在标准输入(或来自文件)上,一系列形式为 git fetch 的行通常留在 FETCH_HEAD:

  • 原始 SHA-1
  • 两个文字标签
  • 分支名称

因此(在我的测试中在分支 example 上):

$ echo $(git rev-parse master)$'\t\t'"'master'" | git fmt-merge-msg --log
Merge 'master' into example

* master:
  [four commits listed here, in my case]

一旦有了像这样的基本提交文本,就可以使用提交的 -F <file> 选项从文件中读取它,或者 -F - 从标准输入中读取它。

(注意:git merge --log master 产生了一个略有不同的消息,即:

Merge branch 'master' into example

* master:
  [same four commits listed]

如果我将 echo 命令更改为 branch 'master',则 第一个 行匹配,但随后以星号为前缀的行显示 branch 'master'.)