关于版本控制:撤消git pull,如何将repos带到旧状态

Undo git pull, how to bring repos to old state

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

编辑我要撤消Git合并以进行澄清。在看到一些答案后,我做了这个

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

现在,我该怎么办?做git reset --hard可以吗?我不想再搞砸了,你要详细的步骤吗?


git pull将做两件事:它做一个git fetch和一个git merge合并已经设置好合并到配置中的分支。

因此,您要做的是撤消合并(撤消提取没有多大意义,不应该是必需的)。

为此,您可以尝试使用git reset --hard重置到以前的状态。使用git reflog命令查找前一状态的sha-1,然后将其重置。

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


与JKP的回答相同,但下面是完整的命令:

1
git reset --hard a0d3fe6

其中a0d3fe6是通过

1
git reflog

看看你想撤销的地方。


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

1
git merge --abort

还有更古老的方法:

1
git reset --merge

以前答案中描述的旧学校方式(警告:将放弃所有本地更改):

1
git reset --hard

但实际上,值得注意的是,考虑到MERGE_HEAD存在,git merge --abort只相当于git reset --merge。这可以在合并命令的git帮助中读取。

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


它起作用了第一次使用:git reflog

找到你的前一个状态的sha和make(head@1就是一个例子)

1
git reset --hard HEAD@{1}


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


假设在执行git pull之前,$COMMIT是最后一个提交ID。你要撤销最后一次抽签

埃多克斯1〔15〕

.

奖金:

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

江户十一〔16〕号

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

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

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


你可以做git reset --hard ORIG_HEAD

因为"拉"或"合并"在执行这些操作之前将orig_head设置为当前状态。


这是恢复拉式更改的最简单方法。

1
git reset --hard 9573e3e0

其中9573e3e0是您的承诺ID


如果合并失败(这是希望撤消git pull的最常见原因),那么运行git reset --merge会完全按照预期执行:保留提取的文件,但撤消git pull试图合并的合并。然后,我们可以决定在没有git merge有时产生的混乱的情况下做什么。而且,它不需要一个来找到其他答案中提到的--hard所要求的确切提交ID。