1255

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

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

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

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

4

15 回答 15

1813

运行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"}
于 2009-08-03T16:47:27.030 回答
447

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

git reset --hard a0d3fe6

通过做找到a0d3fe6

git reflog

并查看您要撤消的点。

于 2014-07-22T00:39:44.657 回答
168

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

git merge --abort

和稍旧的方式:

git reset --merge

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

git reset --hard

但实际上,值得注意的是,thatgit merge --abort仅相当于git reset --mergegiven that MERGE_HEADis present。这可以在 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在日常工作中更有用。

于 2015-05-20T09:17:49.843 回答
78

它首先使用:git reflog

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

git reset --hard HEAD@{1}
于 2016-03-08T17:00:48.757 回答
48

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

git reset --hard $COMMIT

.

奖金:

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

git pull --rebase

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

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

在以下位置查找详细信息:http: //gitolite.com/git-pull--rebase

于 2015-12-23T15:55:03.457 回答
43

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

于 2009-08-03T16:49:24.513 回答
21

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

** Warning **

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

git reset --hard 9573e3e0

9573e3e0您的 {Commit id}在哪里

于 2018-11-13T12:51:11.090 回答
19

你可以做git reset --hard ORIG_HEAD

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

于 2015-08-19T16:52:11.010 回答
8

如果合并失败,这是想要撤消 a 的最常见原因git pull,运行git reset --merge会完全按照人们的预期:保留获取的文件,但撤消git pull尝试合并的合并。然后,人们可以决定要做什么,而不会git merge产生有时会产生的混乱。并且它不需要找到--hard在所有其他答案中提到的确切提交 ID。

于 2018-09-24T17:35:12.213 回答
7

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

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

运行此命令以查看 git 参考。

git reflog

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

运行此命令以回溯到一个点

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

我建议打开 2 个终端,一个显示日志,另一个运行命令

于 2021-07-14T06:46:24.680 回答
7

要将最后一次合并还原为您的custom-branch,最简单的方法是:

git reset --hard custom-branch@{1}

main分支示例:

git reset --hard main@{1}
于 2021-09-20T11:04:22.560 回答
6

git pull做下面的操作。

一世。git fetch

ii.git merge

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

一世。git reset --hard --- 它也恢复所有本地更改

或者

ii. git reset --hard master@{5.days.ago} (如10.minutes.ago, 1.hours.ago, 1.days.ago..)以获取本地更改。

或者

iii.git reset --hard commitid

改进:

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

于 2020-04-05T13:38:17.880 回答
6

尝试运行

git reset --keep HEAD@{1}
于 2020-08-27T18:06:03.390 回答
5

这样做可以取消您的合并操作:git merge --abort

于 2021-10-04T13:30:36.133 回答
3

查看current branch您执行git pull命令的位置的日志

git log

示例输出将如下所示

commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxxa3dd0
Author: user <user@gmail.com>
Date:   Tue Nov 23 20:19:58 2021 +0530

    latest changes

commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxxd697b
Author: user <user@gmail.com>
Date:   Tue Nov 23 17:45:44 2021 +0530

    latest changes includes account details api

commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxxc0e6fa
Author: user <user@gmail.com>
Date:   Tue Nov 23 17:02:39 2021 +0530

    latest changes

复制您想要的最后一个提交 ID。例如,如果您的最后一次提交 id 是xxxxxxxxxxxxxxxxxxxxxxxxxxxxxc0e6fa(假设此提交 id 是您执行 git pull 之前的最后一次提交 id)并且在此提交 id 之上的两次提交是在您的 git pull 命令之后使用此提交 id 来获取您以前的更改

git reset --hard xxxxxxxxxxxxxxxxxxxxxxxxxxxxxc0e6fa

这样做将删除此提交 ID 上方的提交。在此之后,您将获得以前的更改,就这么简单。

于 2021-11-26T14:15:57.000 回答