68

在我的本地仓库中,我有一个提交信息不正确的提交。

我已经发布了不正确的提交消息git push

现在远程仓库(GitHub 托管)也有错误的提交信息。

我已经尝试过git commit --amend,但发现在这种情况下它对我不起作用,因为我已经做出了额外的提交,因为不正确。

您将如何解决这种情况?

4

4 回答 4

100

最简单的解决方案(但请在执行此操作之前阅读整个答案):

  1. git rebase -i <hash-of-commit-preceding-the-incorrect-one>
  2. 在打开的编辑器中,更改pickreword错误提交所在的行。
  3. 保存文件并关闭编辑器。
  4. 编辑器将再次打开并显示不正确的提交消息。修理它。
  5. 保存文件并关闭编辑器。
  6. git push --force更新 GitHub。

这意味着您将发布以前发布的存储库的修改版本。如果有人在您使用不正确的提交消息犯错误和修复它之间从您的仓库中提取或获取,那么他们以后会遇到一些困难。因此,在尝试此操作之前,请确保您可以接受此结果。

于 2011-02-17T17:50:47.437 回答
35

而不是为一次提交走整个变基路线:

git reset --soft head~
git commit -m "The message you wanted to use"
git push -f

您可以在git-reset手册页中查看这些选项。

对于只有您在处理的项目,更改的历史不应该成为问题。

于 2011-02-17T18:03:59.487 回答
6

如果您必须在多个分支上更改旧的提交消息(即,带有错误消息的提交存在于多个分支中),您可能想要使用

git filter-branch -f --msg-filter 'sed "s/<old message>/<new message>/g"' -- --all

替换提交消息。

Git 将创建一个临时目录用于重写并另外备份 refs/original/ 中的旧引用。

-f将强制执行操作。如果临时目录已经存在或者如果已经有引用存储在refs/original下,这是必要的。如果不是这种情况,您可以删除此标志。

--将过滤器分支选项与修订选项分开

--all将确保重写所有分支标签。

由于旧引用的备份,您可以轻松地回到执行命令之前的状态。

说,你想恢复你的主人并在分支 old_master 中访问它:

git checkout -b old_master refs/original/refs/heads/master

在您对更改感到满意后,使用 git push -f 将更改推送到您的公共仓库。

请注意,您应该将此通知您的协作者,因为从第一个修改的提交开始的所有提交的哈希都已更改。

于 2012-11-15T09:46:17.763 回答
2

如果您没有将代码推送到远程分支(Github/Bitbucket),您可以在命令行上更改提交消息,如下所示。

 git commit --amend -m "Your new message"

如果您正在处理特定分支,请执行此操作。

git commit --amend -m "BRANCH-NAME: new message"

如果您已经推送了错误消息的代码,那么您在更改消息时需要小心。即,在您更改提交消息并尝试再次推送它之后,您最终会遇到问题。为了使其顺利,请按照以下步骤操作。 请在做之前阅读整个答案

git commit --amend -m "BRANCH-NAME : your new message"

git push -f origin BRANCH-NAME                # Not a best practice. Read below why?

重要提示:当您直接使用强制推送时,您可能会遇到其他开发人员在同一分支上工作的代码问题。因此,为了避免这种冲突,您需要在强制推送之前从分支中提取代码

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME

如果已推送,这是更改提交消息时的最佳实践。

于 2015-01-13T07:08:36.537 回答