撤消git pull,如何将存储库恢复为旧状态


1006

有什么方法可以还原或撤消git pull,以便我的源/存储库可以恢复到执行git pull之前的旧状态?我要这样做是因为它合并了一些我不想这样做的文件,而只合并了其他剩余的文件。所以,我想找回那些文件,这可能吗?

编辑:我想撤消git merge进行澄清。看到一些答案后,我这样做了

git reflog
bb3139b... HEAD@{0}: pull : Fast forward
01b34fa... HEAD@{1}: clone: from ...name...

现在,我该怎么办?这样做git reset --hard 是OK?我不想再次搞砸,所以要求详细的步骤吗?


23
看起来您的历史记录中只有两件事:克隆和获取。只需重置为clone:, git reset --hard 01b34fa在这种情况下,您可以完成将git reset --hard HEAD^其重置为HEAD之前的一次提交。
2009年

2
如果您想在工作目录中修改文件,则--hard是必要的
William Pursell

3
@ seg.server.fault:如果有效,您可以随时接受答案;)
jkp,2009年

7
git reset --hard HEAD ^
funroll 2013年

7
git reflog将显示一切git所做的一切。人们担心git reset --hard [sha1 of something from reflog]会恢复所示的所有内容reflog,有时这不是目标,例如。您要还原从原始站点中提取的具有不良数据(发生情况)的主分支上的合并,并且在合并之后,您需要处理其他分支。reflog将显示其他分支上的所有费用。但是git checkout master并且git reset --hard [SH1 of commit on master branch just before merge]将仅重置当前的主分支,从原点删除拉合并。
弗拉基米尔·武卡纳克

Answers:


1427

运行git pull按顺序执行以下任务:

  1. git fetch
  2. git merge

合并步骤将已设置要合并到配置中的分支合并。要撤消合并的步骤,但可能不是获取(不使一个很大的意义,不应该是必要的)。

要撤消合并,请使用git reset --hard将本地存储库重置为以前的状态;否则,请执行以下操作。使用git-reflog查找先前状态的SHA-1,然后将其重置为该状态。

警告

本节中列出的命令将删除所有未提交的更改,从而可能导致工作丢失:

git reset --hard

或者,重置为特定的时间点,例如:

git reset --hard master@{"10 minutes ago"}

325
一个很好的方式来接,而不是使用GIT-引用日志和复制散列之前的状态,是使用快捷方式等master@{1},这是以前的位置mastermaster@{"5 minutes ago"}master@{14:30}。有关以这种方式指定修订的完整详细信息,请参见man git-rev-parse“指定修订”部分中的。
卡斯卡贝尔

38
在这种情况下,ORIG_HEAD也应该起作用(“ git reset --hard ORIG_HEAD”)
JakubNarębski09年

@Jelfromi:感谢您的提示,我不知道您可能对修订如此so琐。我知道选择相对于HEAD的修订版,但是提出问题时,我不知道他想走多远。
jkp

当我拉时,它说Updating d2c90a3..035ac4d。在这里,您还可以将其d2c90a3用作重置参数。
2013年

使用reflog时无需键入哈希。您也可以使用HEAD @ {1}或引用日志中定义的先前编号。
西蒙猫猫

338

与jkp的答案相同,但这是完整的命令:

git reset --hard a0d3fe6

通过执行操作找到a0d3fe6的位置

git reflog

并查看您要撤消的时间点。


例如,为什么我不能做git reset HEAD --hard呢?
宋祖

9
@MikeC这种方法使您可以返回多个拉,例如
xji

2
我无法使用左侧ID,但可以正常git reset --hard HEAD@{n}工作
E. Sundin

1
您应该建议对jkp的答案进行修改,而不是在这么多年之后几乎在这里复制它。
Abhishek Anand

如果我使用以下命令git reflog:dab04ec HEAD @ {0},aaaaaaa HEAD @ {1}和bbbbbbb HEAD @ {2}。如果我这样做git reset --hard bbbbbbb,将会丢失HEAD 0和1吗?
pmiranda

115

撤消合并的一种更现代的方法是:

git merge --abort

和稍旧的方式:

git reset --merge

先前答案中描述的老式方法(警告:将丢弃所有本地更改):

git reset --hard

但实际上,值得注意的是,它git merge --abort仅等同于存在的git reset --merge给定条件MERGE_HEAD。可以在git help for merge命令中阅读。

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

合并失败后,如果MERGE_HEAD没有合并失败,则可以(git reset --merge但不一定)撤消失败的合并git merge --abort因此它们不仅是同一事物的新旧语法。这就是为什么我发现git reset --merge在日常工作中更有用的原因。


20
git merge --abort在合并期间(而不是在git pull完成之后)工作。因此,这个答案似乎与问题无关。
阿布舍克·阿南德

1
git reset --merge删除所有未暂存的更改。很难找到这一点。
theadriangreen

62

它可以首次使用: git reflog

找到您之前状态的SHA并进行创建(HEAD @ {1}是一个示例)

git reset --hard HEAD@{1}

40

如果您有gitk(尝试从git命令行运行“ gitk --all”),这很简单。只需运行它,选择要回滚到的提交(单击鼠标右键),然后选择“将主分支重置到此处”。如果没有未提交的更改,请选择“硬”选项。


8
如果您还没有看到它,那么值得运行。它弹出一个疯狂的GUI。
埃文·莫兰

35

假设$COMMIT是您执行之前的最后一个提交ID git pull。您需要撤消上一次拉动是

git reset --hard $COMMIT

奖金:

说到拉动,我想分享一个有趣的技巧,

git pull --rebase

上面的命令是我的git一生中最有用的命令,它节省了很多时间。

在将新提交的内容推送到服务器之前,请尝试使用此命令,它将自动同步最新的服务器更改(通过获取+合并),并将您的提交内容放在git日志的顶部。无需担心手动拉/合并。

有关详细信息,请访问:http : //gitolite.com/git-pull--rebase


17

这是还原更改的最简单方法。

** Warning **

请备份更改的文件,因为它将删除新创建的文件和文件夹

git reset --hard 9573e3e0

9573e3e0您的{Commit id} 在哪里


此响应非常有用,因为如果我们执行git pull origin分支wi这样的操作Updating ffce65bd..e929e884,则可以执行此操作git reset --hard ffce65bd
Ernesto Alfonso

15

你可以做 git reset --hard ORIG_HEAD

因为“ pull”或“ merge”在执行这些操作之前将ORIG_HEAD设置为当前状态。


5

git pull做下面的操作。

一世。 git fetch

ii。 git merge

要撤消拉动,请执行任何操作:

一世。git reset --hard ---还还原所有本地更改

要么

ii。git reset --hard master@{5.days.ago} (像10.minutes.ago1.hours.ago1.days.ago...),以获得局部变化。

要么

iii。 git reset --hard commitid

改善:

下次使用git pull --rebase而不是git pull通过做它的同步服务器更改(获取和合并)。


4

如果合并失败,这是想要撤消a的最常见原因git pull,那么运行git reset --merge将完全符合您的期望:保留获取的文件,但是撤消git pull尝试合并的合并。这样一来,您就可以决定该怎么做,而不会git merge产生有时会造成的混乱。并且不需要--hard其他答案中提到的确切的提交ID 。

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.