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

Chr*_*man 2 git merge

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

现在我处于 MERGE_HEAD 存在的情况,因此我无法重新运行合并,并且系统指示我“请在合并之前提交更改”。

当承诺完成合并时,我找不到创建与我从交换机收到的相同消息的选项merge --log

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

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

tor*_*rek 5

一般来说,如果您开始合并并决定最终不需要它,只需使用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]
Run Code Online (Sandbox Code Playgroud)

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

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

Merge branch 'master' into example

* master:
  [same four commits listed]
Run Code Online (Sandbox Code Playgroud)

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