有什么方法可以恢复或撤消 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 之前的一个提交。
git reflog
将显示使用 git 所做的一切。有人担心 git reset --hard [sha1 of something from reflog]
会还原 reflog
中显示的所有内容,这有时不是目标,例如。您想恢复从原始数据提取的主分支上的合并(发生),并且在合并之后您已经在其他分支上工作。 reflog
将显示其他分支上的每个 chage。但 git checkout master
和 git reset --hard [SH1 of commit on master branch just before merge]
将仅重置当前主分支,从源中删除拉合并。
运行 git pull
按顺序执行以下任务:
git 获取 git 合并
合并步骤结合了已设置为在您的配置中合并的分支。您想撤消合并步骤,但可能不是提取(没有多大意义,也不应该是必需的)。
要撤消合并,请使用 git reset --hard
将本地存储库重置为之前的状态;使用 git-reflog 找到先前状态的 SHA-1,然后重置为它。
警告
本节中列出的命令会删除所有未提交的更改,可能会导致工作丢失:
git reset --hard
或者,重置到特定时间点,例如:
git reset --hard master@{"10 minutes ago"}
与 jkp 的答案相同,但这是完整的命令:
git reset --hard a0d3fe6
通过做找到a0d3fe6
git reflog
并查看您要撤消的点。
git reset HEAD --hard
?
git reset --hard HEAD@{n}
有效
git reflog
上有这个:dab04ec HEAD@{0}、aaaaaaa HEAD@git reflog
和 bbbbbbb HEAD@git reset --hard bbbbbbb
。如果我这样做git reset --hard bbbbbbb
我会丢失 HEAD 0 和 1 吗?
撤消合并的更现代的方法是:
git merge --abort
和稍旧的方式:
git reset --merge
以前的答案中描述的老式方式(警告:将丢弃所有本地更改):
git reset --hard
但实际上,值得注意的是,鉴于存在 MERGE_HEAD
,git 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)
即使在(不成功的)合并期间也不起作用
它首先使用:git reflog
找到你以前状态的 SHA 并制作(HEAD@{1} 是一个例子)
git reset --hard HEAD@{1}
假设 $COMMIT
是您执行 git pull
之前的最后一个提交 ID。您需要撤消最后一次拉动的是
git reset --hard $COMMIT
.
奖金:
说到拉,我想分享一个有趣的技巧,
git pull --rebase
上面这个命令是我 git 生活中最有用的命令,它节省了很多时间。
在将您的新提交推送到服务器之前,请尝试此命令,它会自动同步最新的服务器更改(使用 fetch + 合并)并将您的提交放在 git log 的顶部。无需担心手动拉/合并。
在以下位置查找详细信息:http://gitolite.com/git-pull--rebase
如果你有 gitk(尝试从你的 git 命令行运行“gitk --all”),这很简单。只需运行它,选择要回滚到的提交(右键单击),然后选择“将主分支重置到此处”。如果您没有未提交的更改,请选择“硬”选项。
这是恢复拉取更改的最简单方法。
** Warning **
请备份您更改的文件,因为它会删除新创建的文件和文件夹。
git reset --hard 9573e3e0
9573e3e0
是您的 {Commit id}
Updating ffce65bd..e929e884
的内容,则执行 git reset --hard ffce65bd
你可以做git reset --hard ORIG_HEAD
因为“拉”或“合并”在执行这些操作之前将 ORIG_HEAD 设置为当前状态。
我建议做的第一件事是制作项目的副本。
您可以签出一个新分支(git checkout -b NewCopy),这样您就可以拥有一个副本,然后返回到您从中签出的分支。
运行此命令以查看 git 参考。
git reflog
它将显示您的参考日志和 commit_Id {something like e0371eb},您可以使用它们返回到特定的参考点。
运行此命令以回溯到一个点
git reset --hard 7316f34 //replace that with your commit id
我建议打开 2 个终端,一个显示日志,另一个运行命令
如果合并失败,这是想要撤消 git pull
的最常见原因,则运行 git reset --merge
会完全按照预期执行:保留获取的文件,但撤消 git pull
尝试合并的合并。然后人们可以决定要做什么,而不会产生 git merge
有时会产生的混乱。并且它不需要找到 --hard
在所有其他答案中提到的确切提交 ID。
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)。
尝试运行
git reset --keep HEAD@{1}
要将 last 合并恢复到您的 custom-branch
,最简单的方法是:
git reset --hard custom-branch@{1}
main
分支的示例:
git reset --hard main@{1}
这样做可以取消你的合并操作:git merge --abort。
查看您执行 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 上方的提交。在此之后,您将获得以前的更改,就这么简单。
不定期副业成功案例分享
master@{1}
这样的快捷方式,它是master
、master@{"5 minutes ago"}
或master@{14:30}
的前一个位置。有关以这种方式指定修订的完整详细信息,请参阅man git-rev-parse
,在名为“指定修订”的部分中。Updating d2c90a3..035ac4d
。在这里,您也可以使用d2c90a3
作为参数进行重置。