ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

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

看起来您的历史记录中只有两件事:克隆和获取。只需重置为克隆:git reset --hard 01b34fa,在这种情况下,您可以执行 git reset --hard HEAD^,它将重置为 HEAD 之前的一个提交。
如果要修改工作目录中的文件,则 --hard 是必需的
@seg.server.fault:如果有效,您可以随时接受答案;)
git reset --hard HEAD^
git reflog 将显示使用 git 所做的一切。有人担心 git reset --hard [sha1 of something from reflog] 会还原 reflog 中显示的所有内容,这有时不是目标,例如。您想恢复从原始数据提取的主分支上的合并(发生),并且在合并之后您已经在其他分支上工作。 reflog 将显示其他分支上的每个 chage。但 git checkout mastergit reset --hard [SH1 of commit on master branch just before merge] 将仅重置当前主分支,从源中删除拉合并。

D
Dave Jarvis

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

git 获取 git 合并

合并步骤结合了已设置为在您的配置中合并的分支。您想撤消合并步骤,但可能不是提取(没有多大意义,也不应该是必需的)。

要撤消合并,请使用 git reset --hard 将本地存储库重置为之前的状态;使用 git-reflog 找到先前状态的 SHA-1,然后重置为它。

警告

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

git reset --hard

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

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

一个很好的选择前一个状态的方法,而不是使用 git-reflog 和复制哈希,是使用像 master@{1} 这样的快捷方式,它是 mastermaster@{"5 minutes ago"}master@{14:30} 的前一个位置。有关以这种方式指定修订的完整详细信息,请参阅 man git-rev-parse,在名为“指定修订”的部分中。
在这种情况下,ORIG_HEAD 也应该可以工作(“git reset --hard ORIG_HEAD”)
@Jelfromi:感谢您的提示,我不知道您可能对修订如此冗长。我知道选择相对于 HEAD 的修订,但是当提出问题时,我不知道他想回到多远的时间。
当我拉动时,它显示 Updating d2c90a3..035ac4d。在这里,您也可以使用 d2c90a3 作为参数进行重置。
警告 ::git reset --hard master@{"10 minutes ago"} 使我的 repo 像第一次提交一样,我失去了一切
J
Jeffrey Sun

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

git reset --hard a0d3fe6

通过做找到a0d3fe6

git reflog

并查看您要撤消的点。


例如,为什么我不能只执行 git reset HEAD --hard
@MikeC这种方法允许你返回几个拉,例如
我无法使用左侧 ID,但 git reset --hard HEAD@{n} 有效
您应该建议对 jkp 的答案进行编辑,而不是在这么多年后几乎在这里复制它。
如果我在 git reflog 上有这个:dab04ec HEAD@{0}、aaaaaaa HEAD@git reflog 和 bbbbbbb HEAD@git reset --hard bbbbbbb。如果我这样做git reset --hard bbbbbbb我会丢失 HEAD 0 和 1 吗?
M
Martin G

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

git merge --abort

和稍旧的方式:

git reset --merge

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

git reset --hard

但实际上,值得注意的是,鉴于存在 MERGE_HEADgit merge --abort 仅等同于 git reset --merge。这可以在 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 在日常工作中更有用的原因。


git merge --abort 在合并期间有效,而不是在 git pull 完成之后。所以这个答案似乎与问题无关。
git reset --merge 删除所有未暂存以供提交的更改。发现这个很难。
fatal: There is no merge to abort (MERGE_HEAD missing) 即使在(不成功的)合并期间也不起作用
这实际上是我需要的,因为我还没有完成全部拉动。我知道它不相关,但对我的搜索仍然有帮助
E
Ezequiel García

它首先使用:git reflog

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

git reset --hard HEAD@{1}

C
Community

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

git reset --hard $COMMIT

.

奖金:

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

git pull --rebase

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

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

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


S
Samuel Carrijo

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


如果您还没有看到它,这是值得运行的。它弹出一个疯狂的 GUI。
M
Manish Goswami

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

** Warning **

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

git reset --hard 9573e3e0

9573e3e0 是您的 {Commit id}


此响应非常有用,因为如果我们执行 git pull origin 分支会得到类似 Updating ffce65bd..e929e884 的内容,则执行 git reset --hard ffce65bd
O
Orlando

你可以做git reset --hard ORIG_HEAD

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


S
Slycreator

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

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

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

git reflog

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

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

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

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


D
Davide

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


G
GolamMazid Sajib

git pull 做下面的操作。

一世。 git fetch ii. git 合并

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

一世。 git reset --hard --- 它也恢复所有本地更改或 ii。 git reset --hard master@{5.days.ago}(如 10.minutes.ago、1.hours.ago、1.days.ago ..)以获取本地更改。或三。 git reset --hard commitid

改进:

下次使用 git pull --rebase 而不是 git pull.. 它的同步服务器更改通过执行 (fetch & merge)。


h
henrique_ms

尝试运行

git reset --keep HEAD@{1}

S
Safwan

要将 last 合并恢复到您的 custom-branch,最简单的方法是:

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

main 分支的示例:

git reset --hard main@{1}

b
bigtheo

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


A
Akhil S

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

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)并且在您的 git pull 命令使用此提交 id 获取之前的更改之后,此提交 id 之上的两次提交

git reset --hard xxxxxxxxxxxxxxxxxxxxxxxxxxxxxc0e6fa

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