如何更改旧的提交信息?

10

我需要更改一个旧的提交信息。考虑到我之后又做了几个其他的提交,有没有一种方法可以通过git或直接在GitHub上更改它,而不会干扰其他提交?


1
由于提交哈希包括其父提交的哈希,因此更改任何具有子提交的提交会更改整个子树的哈希。 - Benjamin W.
稍微补充一下@BenjaminW.的评论:这确实会“干扰”其他提交,因为您已经告诉Git,您想用新的改进提交替换所有旧的提交,从您重新命名的提交开始。改进只是为了链接到早期改进的提交,除了重新命名的提交外。这样做的缺点是很容易使您的 Git存储库符合要求,但然后您需要使用--force或类似选项来更新GitHub存储库,然后所有拥有旧提交的人也必须进行更新。 - torek
3个回答

12

如果您的最新提交不是当前使用的提交,则无法使用git commit --amend

您可以尝试使用rebase, 类似于:

git rebase -i HEAD~3

3代表你希望回溯的提交次数。

这是在做交互式变基。在屏幕或文本窗口中打开,用reword替换pick

在下一个屏幕或文本窗口上,您将能够更改提交信息。

进行变基会更改提交哈希值,因此您需要执行git push --force-with-lease,否则您的更改将被服务器拒绝。

--force-with-lease--force比起来通常更安全,尤其是当您做有潜在破坏性的提交时。

请参见链接@Myffo发布的修改旧的或多个提交消息


7
要更改旧提交的消息,您可以使用以下任一方法:
git rebase -i HEAD~4

(4是一个任意数字,您需要使用要更改的提交的等级,最新的提交被视为1)

或者

git rebase -i (SHA of the commit you want to edit)^

例如:git rebase -i 993ff4750f38b701383575a95b4efea54cc77658^(在sha末尾添加'^'符号)

这些命令将在默认的文本编辑器中显示最新的提交。在文本编辑器中查找您想要更改的提交,并将“pick”替换为“reword”。保存并退出后,会弹出另一个窗口供您更改消息。


1

不必重新基于和强制推送修改的分支,可以用不同的消息替换提交,而不影响现有的提交哈希。

语法如下:

git replace --edit <commit>

这将打开编辑器并显示类似于这样的内容:
tree 430db025986d2bf8791be16b370ec37a00f6924b
parent 77efdb98a6e021ca81cd96f7c8c05d25c09e0ad4
author John Doe <johndoe@example.org> 1698219601 +0200
committer John Doe <johndoe@example.org> 1698219601 +0200

<initial commit message>

修改消息并保存。
修改后的引用将需要使用以下方式显式地推送和获取:
git push origin 'refs/replace/*'
git fetch origin 'refs/replace/*:refs/replace/*'

这需要Git 2.1或更高版本。

https://git-scm.com/docs/git-replace


2
然而,要将替换的提交分发给其他方,需要额外的努力。特别是,必须推送和获取refs/replace层级。 - undefined
@j6t 很好的观点,谢谢,我已经提到了。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接