【问题标题】:Accidentally pushed commit: change git commit message意外推送提交:更改 git commit 消息
【发布时间】:2011-06-29 06:38:35
【问题描述】:

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

我已经使用git push 发布了错误的提交消息。

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

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

您将如何解决这种情况?

【问题讨论】:

标签: git git-commit git-amend


【解决方案1】:

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

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

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

对于只有你在做的项目,更改的历史不应该是问题。

【讨论】:

  • 这样做会丢失在“screwed”提交之后完成的所有提交信息(但不是内容)。所有这些后续提交将集中在一个大提交中。
  • 不过,这对于一次提交还是很方便的。
  • 同意。对于手头的问题不是一个好的解决方案,但当您立即意识到需要调整上次提交时非常有用。提醒一句,当像这样使用-f 推送时,请确保您明确引用目标分支,或者您没有其他分支会破坏上游的内容。
  • 运行 git reset --soft head~ 时,我得到“致命:不明确的参数 'head~':未知修订或路径不在工作树中。”
  • 这可能是因为您接近合并。获取您要重置的提交的 sha 并尝试 git reset --soft <sha>
【解决方案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

这是更改提交消息时的最佳做法(如果已推送)。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 因为这是我的家庭项目,这将是一个不错的解决方案。谢谢!
    • 我不同意这是最简单的方法。
    • 啊。没有看到 OP 评论中提供的额外信息。
    • 这个答案就它而言是有帮助的,但是有没有办法获得更多关于“如果有人从你的仓库中提取或获取在你犯了错误的提交消息之间的详细信息,并且当您修复它时,他们以后会遇到一些(小)困难”?我似乎找不到问题和解决方案的任何描述,只是警告......
    • @Tao:有关问题的示例,请参阅progit.org/book/ch3-6.html#the_perils_of_rebasing。没有简单的通用解决方案,因此会出现警告。
    【解决方案4】:

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

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

    替换提交信息。

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

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      相关资源
      最近更新 更多