【问题标题】:How can I undo a `git commit` locally and on a remote after `git push`如何在“git push”之后在本地和远程撤消“git commit”
【发布时间】:2011-09-21 11:48:36
【问题描述】:

我已经执行了git commit,然后是git push。如何在本地和远程存储库上恢复该更改?

$ git log
commit 364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8
Author: Michael Silver <Michael Silver@gmail.com>
Date:   Tue Jun 11 12:24:23 2011 -0700

【问题讨论】:

    标签: git git-push git-commit


    【解决方案1】:
    git reset --hard HEAD~1
    git push -f <remote> <branch>
    

    (推送示例: git push -f origin bugfix/bug123

    这将撤消上次提交并将更新的历史记录推送到远程。您需要传递-f,因为您要替换遥控器中的上游历史记录。

    【讨论】:

    • 或者,使用git reset --hard &lt;the-sha-you-want-to-return-to&gt;
    • 引用被称为 HEAD(区分大小写)
    • 另外,要小心 - AFAIK,如果其他人从回购中撤出,你不应该这样做。
    • @BipinVayalu 它会影响您当前所在的分支。更准确地说,是 HEAD。 HEAD 最常“附加”到分支(指向分支名称而不是直接指向提交)。所以,一般来说,它会影响到 HEAD 指向的分支。使用git log --decorate --oneline 找出您的 HEAD 指向的位置。
    • git reset HEAD~1 如果您不希望您的更改消失(未暂存的更改)。更改、提交并再次推送git push -f [origin] [branch]
    【解决方案2】:

    通常,使用以下方法进行“反向”提交:

    git revert 364705c
    

    然后像往常一样发送到远程:

    git push
    

    这不会删除提交:它会进行额外的提交,撤消第一次提交所做的任何事情。其他任何东西,都不是很安全,尤其是当更改已经传播时。

    【讨论】:

    • 这是一个比 Alexander Groß(选择的答案)更安全(因此可能更好)的答案。
    • @Graeck 每个解决方案都有其含义和优点。
    • 这应该是公认的答案,最好不要覆盖历史记录,如果与团队合作更是如此。 git reset 仅在您尚未将更改推送到服务器时才被接受。
    • @JosueIbarra 我不同意所有情况。在大多数情况下,是的,您不应该覆盖历史记录。但是,我相信在某些合法情况下您绝对应该这样做。例如,您不小心提交并推送了您的秘密文件。那不应该出现在 git repo 中。因此,您可以使用此处接受的答案快速删除它。
    • @bfcoder 如果您将“秘密”推送到远程仓库,则它不再是秘密。正确的解决方法是创造一个新的秘密,而不是试图隐藏你的错误。
    【解决方案3】:

    首先,放松。

    “没有什么在我们的控制之下。我们的控制只是幻觉。”,“人会犯错”

    我知道您无意中将您的代码推送到了remote-master。一切都会好的。

    1. 首先,获取您尝试返回的提交的SHA-1 值,例如提交到主分支。运行这个:

    git log
    

    您会在每个提交中看到一堆 'f650a9e398ad9ca606b25513bd​​4af9fe...' 之类的字符串。从您要返回的提交中复制该编号

    2. 现在,输入以下命令:

    git reset --hard your_that_copied_string_but_without_quote_mark
    

    您应该会看到类似“HEAD is now at”的消息。你很清楚。它刚刚所做的就是在本地反映这种变化。

    3. 现在,输入以下命令:

    git push -f
    

    你应该看到像

    "警告:push.default 未设置;其隐含值已更改 在..... ...总计 0(增量 0),重复使用 0(增量 0)... ...your_branch_name -> master(强制更新)。”

    现在,你们都清楚了。再次用“git log”检查master,你的fixed_destination_commit应该在列表的顶部。

    不客气(提前;))

    更新:

    现在,您在所有这些开始之前所做的更改现已消失。 如果你想把那些辛苦的工作带回来,这是可能的。感谢 git refloggit cherry-pick 命令。

    为此,我建议请关注this blogthis post

    【讨论】:

    • 在执行“git push -f”时也指定远程和分支是一个很好的措施,但“git push -f”在大多数情况下都会起作用
    【解决方案4】:

    git reset HEAD~1 如果您不希望您的更改消失(未暂存的更改)。更改、提交并再次推送git push -f [origin] [branch]

    【讨论】:

      【解决方案5】:

      尝试使用

      git reset --hard <commit id> 
      

      请注意:这里的 commit id 将是您要转到的提交的 id,而不是您要重置的 id。这是我唯一被卡住的地方。

      然后推

      git push -f <remote> <branch>
      

      【讨论】:

        【解决方案6】:

        您可以进行交互式变基:

        git rebase -i <commit>
        

        这将打开您的默认编辑器。只需删除包含要删除的提交的行即可删除该提交。

        当然,您还需要访问远程存储库才能在其中应用此更改。

        看到这个问题:Git: removing selected commits from repository

        【讨论】:

          【解决方案7】:

          或者:

          git push origin +364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8^:master
          

          强制源远程仓库的主分支到最后一次提交的父级

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-11-03
            • 2010-11-19
            • 2012-02-29
            • 2016-01-24
            • 2010-11-30
            • 2016-10-03
            • 2017-01-08
            相关资源
            最近更新 更多