【问题标题】:How to undo a git pull?如何撤消 git pull?
【发布时间】:2011-08-14 11:59:53
【问题描述】:

由于远程源上不需要的提交,我想撤消我的 git pull,但我不知道我必须重置回哪个版本。

我怎样才能回到在远程源上执行 git pull 之前的状态?

【问题讨论】:

  • 旁注:您可能会发现它对 git fetch upstream 有用,然后快速查看 git diff upstream/branch 以了解您将合并的内容。如果一切顺利,然后继续使用 @987654323 @
  • 如果任何时髦的 brogrammer 看到你从 GUI 执行 git 命令,你将失去你所有的街头信誉并被扣掉一周的工资,但 GitHub 桌面 b> 和 Atom 具有用于undo 提交和复选框的安全、直接按钮,可以轻松清晰地暂存和取消暂存文件。 GUI 也是人!

标签: git undo pull


【解决方案1】:

git reflog show 应该向您展示 HEAD 的历史。您可以使用它来确定您在pull 之前的位置。然后你可以reset 你的HEAD 提交。

【讨论】:

  • git reflog show 给出了这个输出:c9e5e4d HEAD@{0}: pull : 快进 1c86a22 HEAD@{1}: pull origin master: Fast forward 05c141a HEAD@{2}: pull : Fast forward我可以安全地将 HEAD 重置为 HEAD@{1}
  • sehe 的另一个答案详细说明了如何到达那里。
  • 在灾难性的提交以某种方式将合并提交散布到我的历史记录之后,这非常有用。通过在 reflog 中寻找最后一个已知的好,然后强制推动,将它们排除在外。
  • 如果pull 是第一个操作怎么办?如果pull 位于HEAD@{1},并且在此之前没有其他内容,您如何恢复到之前的状态?
  • 重新创建存储库?
【解决方案2】:

或者让它比其他答案更明确:

git pull 

哎呀?

git reset --keep HEAD@{1}

早于 1.7.1 的 git 版本没有--keep。如果你使用这样的版本,你可以使用--hard - 但这是一个危险的操作,因为它会丢失任何本地更改。


To the commenter

ORIG_HEAD 是 HEAD 的先前状态,由可能具有危险行为的命令设置,以便于恢复它们。现在 Git 有 reflog 用处不大:HEAD@{1} 大致相当于 ORIG_HEAD(HEAD@{1} 始终是 HEAD 的最后一个值,ORIG_HEAD 是危险操作之前 HEAD 的最后一个值)

【讨论】:

  • HEAD@{1} 和 HEAD^ 有什么区别?
  • @hugemeow 这将是一个很好的问题。同时man git-rev-parse 对此进行了描述。 HEAD@{1}reflog 中符号 HEAD 的前一个值,而 HEAD^ 是当前 HEAD 的(第一个)父修订版。这两者必须是等价的(例如,在变基、硬重置、分支切换等之后)。请阅读链接的文章以获取 reflog。干杯
  • PowerShell 用户,用反引号转义括号:git reset HEAD@`{1`}
  • ss64.com/ps/syntax-esc.html 我想你想输入HEAD@`{1`},或者就此而言,也可以在 POSIX shell 上使用:'HEAD@{1}'
  • 我认为它不仅重置了 pull,而且还重置了我的提交 =(
【解决方案3】:

找到你想要提交的<SHA#>。您可以在 github 中找到它,或者在命令行输入 git loggit reflog show 然后执行 git reset --hard <SHA#>

【讨论】:

  • 找到提交的内容?
  • 抱歉,我已修复 <SHA#>
  • 这是我必须撤消某事时使用最多的命令
【解决方案4】:

这对我有用。

git reset --hard ORIG_HEAD 

撤消合并或拉取:

$ git pull                         (1)
Auto-merging nitfol
CONFLICT (content): Merge conflict in nitfol
Automatic merge failed; fix conflicts and then commit the result.
$ git reset --hard                 (2)
$ git pull . topic/branch          (3)
Updating from 41223... to 13134...
Fast-forward
$ git reset --hard ORIG_HEAD       (4)

查看此内容:HEAD and ORIG_HEAD in Git 了解更多信息。

【讨论】:

    【解决方案5】:

    来自https://git-scm.com/docs/git-reset#Documentation/git-reset.txt-Undoamergeorpullinsideadirtyworkingtree

    撤消合并或拉入脏工作树

    $ git pull           (1)
    Auto-merging nitfol
    Merge made by recursive.
     nitfol               |   20 +++++----
     ...
    $ git reset --merge ORIG_HEAD      (2)
    

    即使 您可能在工作树中进行了本地修改,您可以安全地 当您知道另一个分支中的更改确实发生时,请说 git pull 不与他们重叠。

    查看合并结果后,您可能会发现更改 在另一个分支是不令人满意的。运行git reset --hard ORIG_HEAD 会让你回到原来的位置,但它会丢弃 您不想要的本地更改。 git reset --merge 保留 您的本地更改。

    另见https://stackoverflow.com/a/30345382/621690

    【讨论】:

    • 谢谢!你拯救了我的一天
    【解决方案6】:

    即使上述解决方案确实有效,这个答案是为你准备的,以防你想逆转时钟而不是撤消 git pull。我的意思是,如果你想以X Mins 的方式获得确切的回购然后运行命令

    git reset --hard branchName@{"X Minutes ago"}

    注意:在您实际继续运行此命令之前,请仅在您确定要返回的时间以及我的情况时才尝试此命令。

    我目前在一个分支develop,我应该结帐到一个新分支并拉入另一个分支,比如说分支A,但我不小心跑了 退房前git pull origin A

    为了撤消这个更改,我尝试了这个命令

    git reset --hard develop@{"10 Minutes ago"}

    如果您在 windows cmd 上并获取 error: unknown switch `e

    尝试像这样添加引号

    git reset --hard 'develop@{"10 Minutes ago"}'

    【讨论】:

      【解决方案7】:

      重置主分支:

      git reset --hard origin/master
      

      【讨论】:

        【解决方案8】:

        撤消 git pull

        git reset --hard HEAD^
        

        将您的本地仓库带回之前的提交状态。 如果由于 git pull 下载了任何新文件,它们将被列为未跟踪文件,您可以使用

          git clean -fd
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-10
          • 2011-01-13
          • 2020-09-25
          • 2013-11-20
          • 1970-01-01
          • 2010-11-16
          • 2015-10-20
          相关资源
          最近更新 更多