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

Posted

技术标签:

【中文标题】撤消 git pull,如何将 repos 恢复到旧状态【英文标题】:Undo git pull, how to bring repos to old state 【发布时间】:2010-11-16 10:31:53 【问题描述】:

有什么方法可以恢复或撤消 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] 将仅重置当前主分支,从原点移除拉合并。 【参考方案1】:

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

    git fetch git merge

合并步骤将已设置为合并到您的配置中的分支组合在一起。您想撤消 merge 步骤,但可能不撤消 fetch (没有多大意义,也没有必要)。

要撤消合并,请使用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作为参数进行重置。 使用 reflog 时不需要输入哈希值。您还可以使用 HEAD@1 或 reflog 中定义的任何以前的数字。【参考方案2】:

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

【讨论】:

如果你还没有看到,这个值得一试。它会弹出一个疯狂的 GUI。【参考方案3】:

与 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@1 和 bbbbbbb HEAD@2。如果我这样做git reset --hard bbbbbbb我会丢失 HEAD 0 和 1 吗?【参考方案4】:

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

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

【讨论】:

git merge --abort 在合并期间工作,而不是在 git pull 完成后工作。所以这个答案似乎与问题无关。 git reset --merge 删除所有未暂存为提交的更改。很难找到这一点。【参考方案5】:

你可以git reset --hard ORIG_HEAD

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

【讨论】:

【参考方案6】:

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

git reset --hard $COMMIT

.

奖金:

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

git pull --rebase

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

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

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

【讨论】:

【参考方案7】:

有效 首次使用:git reflog

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

git reset --hard HEAD@1

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

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

** Warning **

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

git reset --hard 9573e3e0

9573e3e0 是您的 Commit id

【讨论】:

这个响应非常有用,因为如果我们执行 git pull origin 分支会得到类似 Updating ffce65bd..e929e884 的内容,则执行 git reset --hard ffce65bd【参考方案10】:

git pull做下面的操作。

我。 git fetch

二。 git merge

要撤消拉取操作:

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

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

三。 git reset --hard commitid

改进:

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

【讨论】:

【参考方案11】:

尝试运行

git reset --keep HEAD@1

【讨论】:

【参考方案12】:

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

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

运行此命令查看 git 参考。

git reflog

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

运行此命令回溯到一个点

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

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

【讨论】:

【参考方案13】:

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

git reset --hard custom-branch@1

main 分支的示例:

git reset --hard main@1

【讨论】:

【参考方案14】:

执行此操作以取消您的合并操作:git merge --abort

【讨论】:

【参考方案15】:

查看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)并且在您的 git pull 命令之后有两次提交高于此提交 id 使用此提交 id 来获取您以前的更改

git reset --hard xxxxxxxxxxxxxxxxxxxxxxxxxxxxxc0e6fa

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

【讨论】:

以上是关于撤消 git pull,如何将 repos 恢复到旧状态的主要内容,如果未能解决你的问题,请参考以下文章

如何撤消 git pull?

使用恢复到上次 git pull --rebase state 之前的状态

Git重置(撤消、丢弃)文件变更

git操作——git pull 撤销误操作,恢复本地代码

如何撤消 git reset --hard HEAD~1?

eclipse中如何使用Git/gitee雷哥pull拉代码,commit提交到本地,Push推送到服务器