Git:如何编辑/更改合并提交的消息?


148

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

git commit --amend如果是最后一次提交(HEAD),则可以正常工作,但是如果之前执行了该HEAD怎么办?

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

Answers:


207

如果您在命令中添加--preserve-merges选项(或它的同义词,-p),git rebase -i则git将在重新设置基准时尝试保留合并,而不是线性化历史记录,并且您也应该能够修改合并提交:

git rebase -i -p HEAD~5

1
我已经做到了,但是在进行了更改之后,我尝试推动更改,然后得到了! [rejected] HEAD -> master (non-fast-forward)error: failed to push some refs to
Marc

1
尝试运行git push -f,然后运行您的origin分支。这应该工作。我遇到了同样的问题,由于某种原因,这是重新设置基准的一种人工手段,因为基本上发生了什么,在重新确定基准之后,您最终获得了独立的领导,因此,-force应该修复该问题并应该推送所有内容。
Radu Comaneci

11
@Marc发生这种情况是因为您修改了已经发送的提交。强制推送到服务器是不正确的做法,因为它可以使您和您的同事完全不同步。好吧,如果你一个人,那应该不是问题。
ibizaman 2014年

HEAD~5您要修改的提交的父级在哪里(通常为sha1 ^)。
加布里埃尔·德维勒

2
--preserve-merges 就是现在 --rebase-merges
OrangeDog

32

请注意,从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(``)的commit ed5144d(2018年2月8日
建议者:Vegard Nossum(vegardQuentin Casasnovas(casasnovas
(通过合并JUNIOÇ滨野- gitster-提交8b49408,2018年2月27日)

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

由于commit dd6fb00(“ rebase -p:修复调用时的引用git merge ”,2018年1月,Git 2.16.0-rc2),因此,将基于执行' git rev-parse --sq-quote' 的子外壳将要重新建立基础的合并提交的提交消息传递给merge命令。

在此子shell周围需要双引号,以便为 git merge命令。

在此修补程序之前,以下合并消息:

"Merge mybranch into mynewbranch

Awesome commit."

变成:

"Merge mybranch into mynewbranch Awesome commit."

经过一段时间rebase -p


在Git 2.23(2019年第二季度)中,“ merge -c”期间的“ ”指令git rebase --rebase-merges应使用户有机会编辑日志消息,即使在其他情况下无需创建新合并并替换现有合并(例如,快进代替) ),但没有。
已更正。

参见Phillip Wood()的commit 6df8df0(2019年5月2日(通过合并JUNIOÇ滨野- -提交c510261,2019年6月13日)phillipwood
gitster


16

另一个仅使用原始命令的好答案-通过knittl https://stackoverflow.com/a/7599522/94687

git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch

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

git rebase <sha of merge> previous_branch --onto HEAD

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


2
这真的很有用,为我节省了很多时间。我的公司阻止了存储库中的某些提交消息,使用--amend或rebase命令很容易,但是:如果我们将某些分支合并到您的分支中,执行一些提交并尝试推送,则存在很大的问题,默认的git合并消息被阻止了(我知道这应该是固定的),这迫使我们更改该信息。在回答这个问题之前,我已经尝试了很多事情来更改提交历史与失败之间的合并消息。
乔瓦尼·席尔瓦

2

git merge --edit
即使在非交互式合并的情况下,也可以提供注释。

git merge --edit --no-ff 如果您遵循git flow并重新基于开发分支并将其合并而没有快速前进,则可能会很有用。


2

对于当前的Git版本(Mai 2020):

git rebase -i -r <parent>

然后在编辑器merge -C ...中用替换merge -c ...

在重新定级期间,这将在编辑器中打开提交消息,您可以在其中进行更改。

(感谢VonC提示。)


0

git rebase -i HEAD~5命令将弹出编辑器。它列出了指定的提交(在本例中为五个)。第一列包含pick每个提交。只需在该编辑器中替换pickreword,然后保存并关闭该编辑器即可。然后git将为您更改pick到的每个提交弹出编辑器,reword并允许您编辑提交消息。


6
除非您还添加-pgit rebase命令,否则这对于合并提交不起作用。
保罗·普赖斯

4
如果是一个不同的问题,则很好的答案
doz87
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.