撤消git pull,如何将repos带到旧状态

时间:2009-08-03 16:42:52

标签: git version-control git-merge

有没有办法恢复或撤消git pull,以便我的源/ repos将进入git pull之前的旧状态? 我想这样做是因为它合并了一些我不想这样做的文件,但只合并了其他剩余的文件。所以,我想要恢复这些文件,这可能吗? 谢谢:))

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

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

现在,我该怎么办?做git reset --hard还行吗?我不想再把它搞砸了,所以要求详细的步骤?

12 个答案:

答案 0 :(得分:1175)

git pull会执行两项操作:它会执行git fetch,然后执行git merge,它会合并已设置为在您的配置中合并的分支。

所以你要做的就是撤消合并(撤消提取没有多大意义,也没有必要)。

为此,您可以尝试使用git reset --hard重置为之前的状态。使用git-reflog命令查找先前状态的SHA-1,然后重置为该状态。

警告git reset --hard删除所有未提交的更改。

答案 1 :(得分:270)

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

git reset --hard a0d3fe6

通过

找到a0d3fe6
git reflog

并查看要撤消的位置。

答案 2 :(得分:96)

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

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在日常工作中更有用。

答案 3 :(得分:49)

它有效 首次使用:git reflog

找到你的普通状态的SHA并制作(HEAD @ {1}就是一个例子)

git reset --hard HEAD@{1}

答案 4 :(得分:38)

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

答案 5 :(得分:27)

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

git reset --hard $COMMIT

加成:

在谈到拉动时,我想分享一个有趣的技巧,

git pull --rebase

以上命令是我git生活中最有用的命令,节省了大量时间。

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

详情请见:http://gitolite.com/git-pull--rebase

答案 6 :(得分:11)

你可以git reset --hard ORIG_HEAD

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

答案 7 :(得分:6)

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

git reset --hard 9573e3e0

9573e3e0是您的{Commit id}

答案 8 :(得分:4)

git pull 执行以下操作。

i。 git fetch

ii。 git merge

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

i。 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 ..通过执行(获取和合并)更改其同步服务器。

答案 9 :(得分:1)

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

答案 10 :(得分:1)

尝试运行

git reset --keep HEAD@{1}

答案 11 :(得分:1)

我建议做的第一件事是制作项目的副本。

你可以签出一个新的分支(git checkout -b NewCopy),这样你就可以有一个副本,然后返回到你签出的分支。

运行此命令查看 git 参考。

git reflog

它将显示您的参考日志和 commit_Id {something like e0371eb},您可以使用它们返回到特定参考点。

运行这个命令回溯到一个点

git reset --hard 7316f34  //replace that with your commit id

我建议打开 2 个终端,一个用来替换日志,另一个用来运行命令