我希望修改在历史记录深处的提交信息,而且我已经推送了许多新的提交。
如何更改提交信息?这是否可能?
我希望修改在历史记录深处的提交信息,而且我已经推送了许多新的提交。
如何更改提交信息?这是否可能?
来自Linus Torvalds的消息可能会回答你的问题:
简短回答:如果已经推送,你不能这样做。
提取(Linus指的是BitKeeper作为BK):
顺便说一句,出于历史兴趣:在BK中,你可以。
如果你习惯了它(就像我一样),它真的非常实用。我会从Andrew那里应用一个补丁轰炸,注意到有些东西不对,然后在推出去之前进行编辑。
我也可以用git做同样的事情。很容易让提交消息不成为名称的一部分,并仍然保证历史记录不变,并允许“稍后修复注释”这件事。
但是我没有这样做。
其中一部分纯粹是“内部一致性”。由于所有内容都受到SHA1保护,并且所有对象都以相同的方式处理,因此Git只是一个更干净的系统。是的,有四种不同类型的对象,它们真的很不同,不能以相同的方式使用,但同时,即使它们的编码可能在磁盘上不同,从概念上讲它们都完全相同。
但是,内部一致性并不是不灵活的借口,显然,如果我们可以在发生错误后修正错误,它将非常灵活。所以这不是一个非常有力的论点。
Git不允许更改提交消息的真正原因非常简单:这样,您可以信任这些消息。如果允许人们在之后更改它们,则这些消息本质上是不可靠的。
git push origin +master:master
,+
符号强制进行推送,即使它不会导致“快进”提交)...你可能会遇到一些麻烦。我曾经使用--force推送到git.git存储库,并被Linus大声斥责。这将为其他人创建很多问题。简单的答案是“不要这样做”。
目前使用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
完成。
你可以使用 git rebase -i
(针对你从中分支出的分支), 'i' 代表交互模式。
将你想要更改的提交注释旁边的 pick
替换为 r
(或 reword
),保存并退出,这样你就能够进行编辑。
再次运行 git push
就完成了!
rebase
的 -p
参数,它可以保留合并。 - Cactus假设你有这样一棵树:
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]
然后,从master
中挑选所有比946992
新的提交,加入到temp
分支并进行提交。如果需要修改它们的commit message,请使用amend
命令。
git cherry-pick 9143a9
git commit --amend -m "<new_message>
...
git cherry-pick 5a6057
git commit --amend -m "<new_message>
这棵树现在看起来像这样:
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
。
现在,您的本地和远程都将拥有所有更新的消息。
(来源:http://git.or.cz/gitwiki/GitTips#head-9f87cd21bcdf081a61c29985604ff4be35a5e6c0)
如何更改历史记录中的提交
由于 Git 中的历史记录是不可变的,因此除了最近的提交(不是分支头)之外,修复任何东西都需要从更改的提交开始重写历史记录并向前。
您可以使用 StGIT 来完成这项工作,必要时初始化分支,撤消到您想要更改的提交,如果需要,请弹出到该提交,进行更改,然后刷新补丁(如果您想更正提交消息,则使用 -e 选项),然后推送所有内容并进行 stg 提交。
或者您可以使用 rebase 进行此操作。创建新的临时分支,使用 git reset --hard 将其回退到您想要更改的提交,更改该提交(它将成为当前 head 的顶部),然后将分支重新设置在更改的提交之上,使用 git rebase --onto 命令。
或者您可以使用 git rebase --interactive,它允许各种修改,例如补丁重新排序、折叠等。
我想这应该回答了您的问题。但是,请注意,如果您已经将代码 推送 到远程存储库并且其他人已经从中拉取了代码,则这将破坏他们的代码历史记录以及他们所做的工作。因此,请小心操作。