我想在历史记录中更深层次地修改提交消息,并且我已经推送了许多新提交。
如何更改提交消息?有可能吗?
答案 0 :(得分:124)
Linus Torvalds的消息可能会回答您的问题:
Modify/edit old commit messages
简答:你不能(如果被推)。
提取(Linus将BitKeeper称为BK):
旁注,只是出于历史兴趣:在BK你可以。
如果你已经习惯了(就像我一样)那真的很实用。一世 将安德鲁应用补丁炸弹,注意出错了,只是 在推出之前编辑它。
我可以用git做同样的事情。这本来很容易 使提交消息不是名称的一部分,仍然保证 历史未受影响,并允许“以后修改评论” 的事情。
但我没有。
部分内容纯粹是“内部一致性”。 Git只是一个清洁工 系统归功于所有受SHA1保护的所有对象 无论对象类型如何,处理相同。是的,有四个 不同种类的物体,它们都是真正不同的,它们 不能以同样的方式使用,但同时,即使他们的 磁盘上的编码可能不同,概念上它们都可以正常工作 同样的。
但内部的一致性并不是缺乏灵活性的借口 显然,如果我们能够解决之后的错误,那将是非常灵活的 他们发生了。所以这不是一个非常有力的论点。
真正的原因git不允许您更改提交消息的结束 非常简单:这样,你可以信任这些消息。如果你允许的话 人们事后要改变它们,这些信息本来就不是很好 值得信赖的。
要完成,您可以重写您的本地提交历史记录,以反映您想要的内容,如suggested by sykora(使用一些rebase并重置--hard,gasp!)
但是,一旦您再次发布修订后的历史记录(使用git push origin +master:master
,+
符号就会强制推送,即使它不会导致“快进”提交......你might get into some trouble。
从其他SO问题中摘录:
我实际上曾经用--force推送到git.git存储库并被Linus BIG TIME骂了一顿。它会给其他人带来很多问题。一个简单的答案是“不要这样做”。
答案 1 :(得分:26)
目前git replace可以解决问题。
详细说明: 创建临时工作分支
git checkout -b temp
重置为提交以替换
git reset --hard <sha1>
使用正确的消息修改提交
git commit --amend -m "<right message>"
将旧提交替换为新提交
git replace <old commit sha1> <new commit sha1>
回到你所在的分行
git checkout <branch>
删除临时分支
git branch -D temp
推
guess
进行。
答案 2 :(得分:17)
您可以使用git rebase -i
(针对您分支的分支)
'i'代表互动。
使用pick
(或r
)替换您要更改的提交评论旁边的reword
,保存并退出,这样您就可以进行编辑
git push
再一次,你已经完成了!
答案 3 :(得分:13)
假设你有一棵这样的树:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
首先,checkout
临时分支:
git checkout -b temp
在temp
分支上,reset --hard
到要更改其消息的提交(例如,该提交是946992
):
git reset --hard 946992
使用amend
更改消息:
git commit --amend -m "<new_message>"
之后,树将如下所示:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
\
b886a0 [temp]
然后,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>
现在强制将temp分支推送到远程:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
\
b886a0 - 41ab2c - 6c2a3s - 7c88c9 [temp]
最后一步,删除本地git push --force origin temp:master
上的分支master
以从服务器中提取分支git fetch origin
,然后切换到分支master
并删除分支master
}。
现在您的本地和远程都将更新所有消息。
答案 4 :(得分:5)
在我们的商店,我介绍了向带有错误消息的提交添加可识别命名的注释标签,并使用注释作为替换的约定。
尽管这对帮助运行随意“git log”命令的人没有帮助,但它确实为我们提供了一种方法来修复注释中不正确的错误跟踪器引用,并且我的所有构建和发布工具都理解该约定。
这显然不是一般性的答案,但它可能是人们可以在特定社区内采用的东西。我敢肯定,如果这是用于更大规模,可能会出现某种瓷器支撑,最终...
答案 5 :(得分:2)
(来自http://git.or.cz/gitwiki/GitTips#head-9f87cd21bcdf081a61c29985604ff4be35a5e6c0)
如何更改历史记录中的提交
由于Git中的历史是不可变的,因此除了最近的提交(不是分支头的提交)之外的任何修改都需要从更改的提交和转发中重写历史记录。
您可以使用StGIT,必要时初始化分支,取消提交您想要更改的提交,必要时弹出它,进行更改然后刷新补丁(如果要更正提交消息,请使用-e选项) ,然后推送一切和stg提交。
或者您可以使用rebase来做到这一点。创建新的临时分支,使用git reset --hard将其回滚到要更改的提交,更改该提交(它将是当前头部的顶部),然后使用git rebase --onto在更改的提交之上进行rebase分支。
或者您可以使用git rebase --interactive,它允许各种修改,如补丁重新排序,折叠,......
我认为应该回答你的问题。但是,请注意,如果您已将推送代码发送到远程存储库并且人们已从中取出,那么这将会破坏他们的代码历史记录以及他们已完成的工作。所以要小心。
答案 6 :(得分:0)