如何撤消git pull?


238

我想撤消我的git pull,原因是远程源上的有害提交,但是我不知道我必须重置回哪个修订版。

在git拉远端之前,如何才能回到状态?


4
旁注:您可能会发现首先进行后续操作很有用git fetch upstream,然后快速看一下git diff upstream/branch要合并的内容。如果一切顺利,请继续进行git merge upstream/branch
Shahbaz 2013年

1
如果任何时髦的Brogrammer看到您通过GUI 执行git命令,您将失去所有的信誉,并被扣去一周的薪水,但是GitHub DesktopAtom都具有安全,直接的undo提交按钮和复选框,可轻松,清晰地暂存和取消暂存文件。GUI也是人!
Dem Pilafian

Answers:


391

或者使其比其他答案更明确:

git pull 

哎呀

git reset --keep HEAD@{1}

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


致评论者

ORIG_HEAD是HEAD的先前状态,由可能具有危险行为的命令设置,以使其易于还原。现在,Git具有reflog不再有用:HEAD @ {1}大致等同于ORIG_HEAD(HEAD @ {1}始终是HEAD的最后一个值,ORIG_HEAD是危险操作之前HEAD的最后一个值)


2
HEAD @ {1}和HEAD ^有什么区别?
greatmeow 2012年

7
@hugemeow这将是一个很好的问题。同时man git-rev-parse对此进行描述。HEAD@{1}是象征性的先前值HEADreflogHEAD^在所述(第一)父修改的电流HEAD。这两个点需要相等(例如,在重新设置基准,硬重置,分支开关等之后)。请阅读链接文章以获得reflog。干杯
sehe 2012年

10
PowerShell用户,请反击:git reset HEAD@`{1`}
Robert Claypool

3
ss64.com/ps/syntax-esc.html我想您想输入HEAD@`{1`},或者也可以在POSIX shell上做些什么:'HEAD@{1}'
sehe 2013年

2
我认为,它不仅重置了拉力,而且还重置了我的提交=
falsarella

67

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


git reflog show显示了以下输出:c9e5e4d HEAD @ {0}:拉:快进1c86a22 HEAD @ {1}:拉原点主机:快进05c141a HEAD @ {2}:拉:快进我可以安全地将HEAD重置为HEAD @ {1}
Kartins 2011年

sehe的另一个答案详细说明了如何到达那里。
Noufal Ibrahim 2011年

在灾难性的提交以某种方式穿插合并到我的历史记录之后,这很有用。通过在reflog中寻找最后已知的商品将他们淘汰,然后强行推入。
多梅尼克(Domenic),2012年

如果pull先采取行动怎么办?如果pull位于HEAD@{1},并且之前没有其他内容,您如何还原到之前的状态?
亨德拉·乌齐亚

重新创建存储库?
Noufal Ibrahim

29

这对我有用。

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)

检出此内容:Git中的HEAD和ORIG_HEAD了解更多。


17

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


查找提交内容?
马丁

抱歉,我解决了<SHA#>
Nina

当我不得不撤消某些操作时,这是我使用最多的命令
Kartins 2015年

2

来自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


谢谢!您保存了我的一天
Thiago Martins
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.