Von*_*onC 125
来自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骂了一顿.它会给其他人带来很多问题.一个简单的答案是"不要这样做".
小智 26
目前git替换可能会成功.
详细信息:创建临时工作分支
git checkout -b temp
Run Code Online (Sandbox Code Playgroud)
重置为要替换的提交
git reset --hard <sha1>
Run Code Online (Sandbox Code Playgroud)
使用正确的消息修改提交
git commit --amend -m "<right message>"
Run Code Online (Sandbox Code Playgroud)
用新的提交替换旧提交
git replace <old commit sha1> <new commit sha1>
Run Code Online (Sandbox Code Playgroud)
回到原来的分店
git checkout <branch>
Run Code Online (Sandbox Code Playgroud)
删除临时分支
git branch -D temp
Run Code Online (Sandbox Code Playgroud)
推
guess
Run Code Online (Sandbox Code Playgroud)
完成.
小智 17
你可以使用git rebase -i(对你分支的分支)'i'进行交互.
pick使用r(或reword)替换要更改的提交注释的旁边,保存并退出,这样您就可以进行编辑.
git push 再一次,你完成了!
Huy*_* Vo 13
假设你有一个这样的树:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
Run Code Online (Sandbox Code Playgroud)
首先,checkout临时分支:
git checkout -b temp
Run Code Online (Sandbox Code Playgroud)
在temp分支上,reset --hard对要更改其消息的提交(例如,提交是946992):
git reset --hard 946992
Run Code Online (Sandbox Code Playgroud)
使用amend更改消息:
git commit --amend -m "<new_message>"
Run Code Online (Sandbox Code Playgroud)
之后,树将如下所示:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
\
b886a0 [temp]
Run Code Online (Sandbox Code Playgroud)
然后,cherry-pick所有的承诺是提前946992从master到temp并提交它们,使用amend,如果你想改变自己的消息,以及:
git cherry-pick 9143a9
git commit --amend -m "<new_message>
...
git cherry-pick 5a6057
git commit --amend -m "<new_message>
Run Code Online (Sandbox Code Playgroud)
树现在看起来像这样:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
\
b886a0 - 41ab2c - 6c2a3s - 7c88c9 [temp]
Run Code Online (Sandbox Code Playgroud)
现在强制将temp分支推送到远程:
git push --force origin temp:master
Run Code Online (Sandbox Code Playgroud)
最后一步,删除master本地的git fetch origin分支,master从服务器拉分支,然后切换到分支master和删除分支temp.
现在,本地和远程都将更新所有消息.
在我们的商店,我介绍了将可识别命名的带注释标签添加到具有错误消息的提交,并使用注释作为替换的约定.
虽然这对那些运行随意"git log"命令的人没有帮助,但它确实为我们提供了一种在注释中修复错误的bug跟踪器引用的方法,并且我的所有构建和发布工具都理解了约定.
这显然不是一般性的答案,但它可能是人们可以在特定社区内采用的东西.我敢肯定,如果这是用于更大规模,可能会出现某种瓷器支撑,最终......