【问题标题】:Undo git pull, how to bring repos to old state撤消 git pull,如何将 repos 恢复到旧状态
【发布时间】: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] 将仅重置当前主分支,从原点移除拉合并。

标签: git version-control git-merge


【解决方案1】:

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

  1. git fetch
  2. 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 的提交。在此之后,您将获得以前的更改,就这么简单。

                    【讨论】:

                      猜你喜欢
                      • 2022-11-02
                      • 2011-08-14
                      • 1970-01-01
                      • 2012-06-10
                      • 2011-01-13
                      • 2017-09-15
                      • 2020-09-25
                      • 2014-03-04
                      相关资源
                      最近更新 更多