Git:如何编辑/重写合并提交的消息?

ma1*_*w28 135 git commit git-amend

如何编辑或重新编写合并提交的消息?

git commit --amend如果它是最后一次提交make(HEAD),那么它会起作用,但如果它出现之前HEAD呢?

git rebase -i HEAD~5 没有列出合并提交.

Mar*_*air 185

如果您将该--preserve-merges选项(或其同义词-p)添加到git rebase -i命令,那么git将尝试在重新定位时保留合并,而不是线性化历史记录,您应该也能够修改合并提交:

git rebase -i -p HEAD~5
Run Code Online (Sandbox Code Playgroud)

  • @Marc这是因为您修改了已发送的提交.强制推送到服务器被认为是不好的做法,因为它可以完全取消您和您的同事的同步.好吧,如果你一个人,那应该不是问题. (10认同)
  • `--preserve-merges` 现在是 `--rebase-merges` (10认同)
  • 尝试运行 git push -f 然后你的原始分支。这应该有效。我遇到了同样的问题,出于某种原因,这是变基的人工制品,因为基本上发生的是,变基后你最终得到了一个分离的对冲,所以 -force 应该解决这个问题并应该推动一切。 (2认同)

Von*_*onC 30

请注意,启动git1.7.9.6(和git1.7.10 +)git merge本身将始终触发编辑器,以便为合并添加详细信息.

" git merge $tag"合并带注释的标签始终在交互式编辑会话期间打开编辑器.v1.7.10系列引入了一个环境变量GIT_MERGE_AUTOEDIT来帮助旧脚本拒绝这种行为,但维护跟踪也应该支持它.

它还引入了一个环境变量GIT_MERGE_AUTOEDIT来帮助旧脚本拒绝此行为.

请参阅" 预测Git 1.7.10 ":

最近在讨论Git邮件列表时,Linus承认(并且我同意)这是我们在Git历史早期所犯的设计错误之一.
在1.7.10及更高版本中,在交互式会话中运行的git merge命令(即它的标准输入和连接到终端的标准输出)将在创建提交以记录合并结果之前打开编辑器,用户有机会解释合并,就像用户在解决冲突合并后运行的git commit命令一样.

莱纳斯说:

但我并不十分关心它是如何工作的 - 我的主要问题是git使得合并消息变得太容易了.
我认为其中一部分是一个更简单的愚蠢:我们甚至从未启动编辑器默认为"git merge",但我们做的是" git commit".
这是一个设计错误,这意味着如果你想真正为合并添加一个注释,你必须做额外的工作.所以人们没有
.


请注意,在Git 2.17(2018年第二季度)之前," git rebase -p"合并提交的错误日志消息现已修复.

Gregory Herrero(``)提交ed5144d(2018年2月8日).
建议:Vegard Nossum(vegard)Quentin Casasnovas(casasnovas).
(由Junio C gitsterHamano合并- -提交8b49408,2018年2月27日)

rebase -p:调用时修复错误的提交消息git merge.

提交dd6fb00(" rebase -p:在调用时修复引用git merge",2018年1月,Git 2.16.0-rc2)以来,使用子shell执行' git rev-parse --sq-quote' 将重新绑定的合并提交的提交消息传递给merge命令.

此子shell周围需要双引号,以便为git merge命令保留换行符.

在此补丁之前,遵循合并消息:

"Merge mybranch into mynewbranch

Awesome commit."
Run Code Online (Sandbox Code Playgroud)

变为:

"Merge mybranch into mynewbranch Awesome commit."
Run Code Online (Sandbox Code Playgroud)

经过rebase -p.


imz*_*hev 9

另一个仅使用原始命令的好答案-通过knittl /sf/answers/531966571/

git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch
Run Code Online (Sandbox Code Playgroud)

或更好(更正确)的最终rebase命令:

git rebase <sha of merge> previous_branch --onto HEAD
Run Code Online (Sandbox Code Playgroud)

顺便说一句,使用原始命令可能会具有很好的“功能”,即不会消耗太多的CPU,并且让您等待未知的时间,直到Git完成考虑需要重新提交的提交列表git rebase -p -i HEAD^^^^(例如,这样的命令会导致仅4次最后一次提交与合并的列表,就我而言,最后一次提交大约花费了50秒!)。

  • 这真的很有用,为我节省了很多时间。我的公司在存储库中阻止了一些提交消息,这很容易使用 --amend 或 rebase 命令,但是:如果我们将某些分支合并到您的分支中,做一些提交并尝试推送,则大问题是 git 的默认合并消息被阻止(这应该是固定的,我知道)这迫使我们改变该消息。在此答案之前,我尝试了很多方法来更改未成功提交历史记录之间的合并消息。 (3认同)

A J*_*lay 8

使用--rebase-merges(或缩写的-r)标志:

git rebase -i -r HEAD~5
Run Code Online (Sandbox Code Playgroud)

然后将要更改的提交旁边的“pick”文本更改为“edit”或“reword”:

pick <commit-hash-to-leave> <message>
edit <commit-hash-to-change> <message>
Run Code Online (Sandbox Code Playgroud)

--rebase-merges(或缩短的)标志-r取代了不推荐使用的
--preserve-merges(或缩短的-p

文档:https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt--r


Emp*_*pus 5

git merge --edit
即使在非交互式合并的情况下也允许您给出评论。

git merge --edit --no-ff 如果您遵循 git flow 并在开发分支上重新建立基础并在没有快进的情况下合并到其中,这会很有用。


Eug*_*bun 5

对于当前的 Git 版本(2020+),只需执行git rebase -i -r <parent>,然后在编辑器中替换merge -Cmerge -c. 这将在变基期间在编辑器中打开合并提交的消息,您可以在其中更改它(感谢VonC提示)。


Yga*_*bel 5

2021 年的更新,-p已弃用。

使用--rebase-merges来代替。

  • 您能举个例子吗? (3认同)