【问题标题】:Is 'git reset --hard Head~1' enough to undo a git pull?'git reset --hard Head~1' 是否足以撤消 git pull?
【发布时间】:2015-10-20 11:22:51
【问题描述】:

我是一个 git 新手,我想了解如何撤消 git 中的更改。假设我有两个分支

1:大师
2:工作

我在工作分支工作,我想从工作分支的队友那里获取最新的更改,所以我应该下达命令

git pull origin work

但是,我给了命令

 git pull origin master

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

git reset --hard HEAD~1

上面的命令会完成撤消 git pull 吗?是否有可能无法正常工作的情况?

编辑

阅读答案后,在 pull/merge 后 HEAD~1 和 ORIG-HEAD 指的是同一个提交吗?

【问题讨论】:

  • HEAD~1 仅撤消 1 次提交,可以合并。然而,拉动可能已经添加了多个提交(快进)。你应该git log 看看添加了什么。 (最好是在拉之前git tag X)。如果您不想计算拉取的提交,您可以git branch -f master <last_good_commit>
  • 最好使用git reflog而不是寻找git日志。

标签: git


【解决方案1】:

首先,git reset 不带--head 选项,我想你的意思是--hard。其次,不,这还不够,git reset --head HEAD~1 会将您的存储库带到上一次提交的状态。如果git pull 导致许多新的提交,那还不够。你需要做的:

$ git reset --hard ORIG_HEAD

之所以有效,是因为在执行合并、变基和其他潜在危险操作之前,Git 设置了一个名为 ORIG_HEAD 的特殊引用,该引用等于在此操作之前当前 HEAD 的 SHA1。下次在做git pull 之前注意SHA1 的当前HEAD 和之后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 中?)
  • @Dude:git pull 是只添加了提交还是添加了许多提交?
  • 多次提交。如果你愿意,我也可以发布日志?
  • @Dude:不,没必要。在此命令中:git reset --hard HEAD~1~ 后面的数字表示您想要返回多少次提交。您可以在man gitrevisions 中了解它。如果你只拉了一个提交,它会像一个魅力一样发挥作用,因为它会给你带来一个准确的提交——这是你在做 git pull 之前的位置。但是,如果您拉取了多个提交,它会将您带回到您 拉取 的提交之一,而不是您在执行 git pull 之前所做的提交。
【解决方案2】:

我建议您使用git guigitk 查看历史记录并进行重置。

但是如果你想使用终端:

查看 HEAD 在拉动之前的位置

git reflog

您应该会看到 HEAD 先前位置的 SHA1。

然后(按照肯尼的建议):

git reset --hard <previousSHA1>

或:

git branch -f master <previousSHA1>

【讨论】:

    猜你喜欢
    • 2010-09-05
    • 2018-05-30
    • 2014-08-25
    • 2018-01-13
    相关资源
    最近更新 更多