“git reset --hard Head~1”足以撤销git pull吗?

3
我是一名 Git 新手,我正在尝试理解如何在 Git 中撤销更改。假设我有两个分支:
1:master 2:work
我正在 work 分支中工作,并且想要从我的队友那里拉取 work 分支的最新更改,因此我应该执行以下命令:
git pull origin work

但是相反,我下达了指令。
 git pull origin master

它从主分支获取一堆提交。现在,假设没有本地未提交的更改,我想撤销上次拉取,这个命令是否足够

该命令将回滚最后一次拉取操作:

git reset --hard HEAD^

git reset --hard HEAD~1

以上命令可以撤销git pull吗?是否存在它无法工作的情况?

编辑

在阅读答案后,pull/merge后HEAD~1和ORIG-HEAD是否指向同一次提交?


https://dev59.com/22865IYBdhLWcg3wFqZV - billyonecan
HEAD~1 只会撤销一个提交,对于合并操作来说是可以的。但是拉取操作可能会添加多个提交(快进)。你应该使用 git log 命令查看添加了什么内容。(最好在拉取之前使用 git tag X 命令打标签)。如果您不想计算已拉取的提交,则可以使用 git branch -f master <last_good_commit> 命令。 - Kenney
最好使用 git reflog 而不是寻找 git log。 - blashser
2个回答

3

首先,git reset命令没有--head选项,我想你的意思是--hard。其次,不,这样做不够用,因为git reset --hard HEAD~1将会让你的版本库回滚到上一个提交状态。如果git pull命令有很多新的提交,这样是不够的。你需要执行以下操作:

$ git reset --hard ORIG_HEAD

这种方法的有效性在于,在进行合并、变基和其他可能存在风险的操作之前,Git 会设置一个特殊引用,称为 ORIG_HEAD ,将其设置为此操作之前当前 HEADSHA1 值。下一次执行 git pull 之前,请注意当前 HEADSHA1 值,并在执行 git pull 后查看自己发现 ORIG_HEAD 指向之前的 HEAD

$  cat .git/ORIG_HEAD

我已经尝试过两次git pull,一次使用快进方式,另一次使用递归方式。在这两种情况下,git pull都会在git reflog中添加一个提交,并且git reset --hard HEAD~1可以撤消git pull。那么,在什么情况下git pull会导致多个提交(在git reflog中)? - Max
@Dude:git pull 命令只添加了一个提交还是多个提交? - Arkadiusz Drabczyk
有不止一个提交。如果您想要,我也可以发布日志? - Max
@Dude:不需要。在这个命令中:git reset --hard HEAD~1~后面的数字表示你想要回退多少次提交。你可以在man gitrevisions中了解更多信息。如果你只拉取了一个提交,它会像魔法一样工作,因为它会将你带回到之前执行git pull时所在的提交位置。但是,如果你拉取了多个提交,它会将你带回到你拉取的其中一个提交,而不是你在执行git pull之前所在的提交。 - Arkadiusz Drabczyk

1
我建议您使用git guigitk来查看历史记录并执行重置操作。

但是如果您想使用终端:

要查看pull之前的HEAD所在位置

git reflog

你应该看到上一个HEAD位置的SHA1值。
然后(如Kenney所建议的):
git reset --hard <previousSHA1>

或者:

git branch -f master <previousSHA1>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接