我想在历史记录中更深层次地修改提交消息,并且我已经推送了许多新的提交.
如何更改提交消息?可能吗?
来自Linus Torvalds的消息可能会回答您的问题:
修改/编辑旧的提交消息
简短的回答:你不能(如果被推).
提取(Linus将BitKeeper称为BK):
旁注,只是出于历史兴趣:在BK你可以.
如果你已经习惯了(就像我一样)那真的很实用.我会用安德鲁的补丁炸弹,注意出错了,然后在推出之前编辑它.
我可以用git做同样的事情.简单地说,提交消息不是名称的一部分,并且仍然保证历史不受影响,并且允许"稍后修改注释"的事情.
但我没有.
其中一部分纯粹是"内部一致性". 由于受到SHA1保护的所有内容,Git只是一个更简洁的系统,所有对象都被处理相同,无论对象类型如何.是的,有四种不同的对象,它们都是真的不同,它们不能以相同的方式使用,但同时,即使它们的编码在磁盘上可能不同,从概念上讲它们都可以正常工作相同.
但内部一致性并不是缺乏灵活性的借口,显然如果我们能够在发生错误后修复错误,那将非常灵活.所以这不是一个非常有力的论点.
git不允许您更改提交消息的真正原因最终非常简单:这样,您可以信任消息.如果您允许人们事后更改它们,则这些消息本质上不是非常值得信赖的.
为了完整,您可以重写您的本地提交历史记录,以反映您想要的内容,如sykora所建议的(使用一些rebase和reset - hard,gasp!)
但是,一旦您再次发布修订后的历史记录(使用a git push origin +master:master
,+
强制推送发生的符号,即使它不会导致"快进"提交)...您可能会遇到麻烦.
摘自其他SO问题:
我实际上曾经用--force推送到git.git存储库并被Linus BIG TIME骂了一顿.它会给其他人带来很多问题.一个简单的答案是"不要这样做".
目前git替换可能会成功.
详细信息:创建临时工作分支
git checkout -b temp
重置为要替换的提交
git reset --hard
使用正确的消息修改提交
git commit --amend -m ""
用新的提交替换旧提交
git replace
回到原来的分店
git checkout
删除临时分支
git branch -D temp
推
guess
完成.
你可以使用git rebase -i
(对你分支的分支)'i'进行交互.
pick
使用r
(或reword
)替换要更改的提交注释的旁边,保存并退出,这样您就可以进行编辑.
git push
再一次,你完成了!
假设你有一个这样的树:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
首先,checkout
临时分支:
git checkout -b temp
在temp
分支上,reset --hard
对要更改其消息的提交(例如,提交是946992
):
git reset --hard 946992
使用amend
更改消息:
git commit --amend -m ""
之后,树将如下所示:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master] \ b886a0 [temp]
然后,cherry-pick
所有的承诺是提前946992
从master
到temp
并提交它们,使用amend
,如果你想改变自己的消息,以及:
git cherry-pick 9143a9 git commit --amend -m "... git cherry-pick 5a6057 git commit --amend -m "
树现在看起来像这样:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master] \ b886a0 - 41ab2c - 6c2a3s - 7c88c9 [temp]
现在强制将temp分支推送到远程:
git push --force origin temp:master
最后一步,删除master
本地的git fetch origin
分支,master
从服务器拉分支,然后切换到分支master
和删除分支temp
.
现在,本地和远程都将更新所有消息.
在我们的商店,我介绍了将可识别命名的带注释标签添加到具有错误消息的提交,并使用注释作为替换的约定.
虽然这对那些运行随意"git log"命令的人没有帮助,但它确实为我们提供了一种在注释中修复错误的bug跟踪器引用的方法,并且我的所有构建和发布工具都理解了约定.
这显然不是一般性的答案,但它可能是人们可以在特定社区内采用的东西.我敢肯定,如果这是用于更大规模,可能会出现某种瓷器支撑,最终......