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

seg*_*ult 939 git version-control git-merge

有没有办法恢复或撤消git pull,以便我的源/ repos将进入git pull之前的旧状态?我想这样做是因为它合并了一些我不想这样做的文件,但只合并了其他剩余的文件.所以,我想要恢复这些文件,这可能吗?谢谢 :)

编辑我想撤消git merge以澄清.看到一些答案后,我就这样做了

git reflog
bb3139b... HEAD@{0}: pull : Fast forward
01b34fa... HEAD@{1}: clone: from ...name...
Run Code Online (Sandbox Code Playgroud)

现在,我该怎么办?做的git reset --hard 还行吗?我不想再把它搞砸了,所以要求详细的步骤?

jkp*_*jkp 1309

git pull将做两件事:它做一个git fetch然后git merge它合并已设置为在您的配置中合并的分支.

所以你想要做的是撤消合并(撤消fetch并没有多大意义,也不是必要的).

要做到这一点,您可以尝试使用git reset --hard重置为以前的状态.使用git-reflog命令查找先前状态的SHA-1,然后重置为该状态.

警告:git pull删除所有未提交的更改.

  • 选择以前的状态而不是使用git-reflog和复制哈希的一种很好的方法是使用像`master @ {1}`这样的快捷方式,这是`master`的先前位置,`master @ {"5分钟之前"}`,或者`master @ {14:30}`.有关以这种方式指定修订的完整详细信息,请参阅"man git-rev-parse",在"指定修订版"一节中. (310认同)
  • 在这种情况下ORIG​​\_HEAD也应该工作("git reset --hard ORIG\_HEAD") (38认同)
  • 警告 ::git reset --hard master@{"10 分钟前"} 让我的仓库像第一次提交一样,我失去了一切 (5认同)

Jef*_*Sun 303

与jkp的答案相同,但这是完整的命令:

git reset --hard a0d3fe6
Run Code Online (Sandbox Code Playgroud)

通过这样做找到a0d3fe6

git reflog
Run Code Online (Sandbox Code Playgroud)

并查看要撤消的点.

  • @MikeC例如,这种方法可以让你回到几次拉动 (8认同)
  • 例如,为什么我不能只执行“git reset HEAD --hard”? (2认同)
  • 我无法使用左侧的 id,但 `git reset --hard HEAD@{n}` 有效 (2认同)
  • 您应该建议对 jkp 的答案进行编辑,而不是在这么多年之后几乎在此处复制它。 (2认同)

Mar*_*n G 111

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

git merge --abort
Run Code Online (Sandbox Code Playgroud)

而稍微老一点的方式:

git reset --merge
Run Code Online (Sandbox Code Playgroud)

之前答案中描述的老派方式(警告:将丢弃所有本地更改):

git reset --hard
Run Code Online (Sandbox Code Playgroud)

但实际上,值得注意的git merge --abort是,它只相当于给git reset --mergeMERGE_HEAD的存在.这可以在git help for merge命令中读取.

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.
Run Code Online (Sandbox Code Playgroud)

合并失败后,如果没有合并,MERGE_HEAD则失败的合并可以撤消,git reset --merge但不一定是撤消git merge --abort,因此它们不仅是同一事物的旧语法和新语法.这就是我发现git reset --merge在日常工作中更有用的原因.

  • `git merge --abort`在合并期间工作,而不是在'git pull`完成之后.所以这个答案似乎与这个问题无关. (17认同)
  • `git reset --merge` 删除所有未暂存提交的更改。很难发现这一点。 (3认同)
  • 这实际上是我所需要的,因为我还没有完成完整的拉动。我知道它不相关,但对我的搜索仍然有帮助 (2认同)

小智 56

它首先使用: git reflog

找到你的previus状态的SHA并制作(HEAD @ {1}就是一个例子)

git reset --hard HEAD@{1}
Run Code Online (Sandbox Code Playgroud)


Sam*_*ijo 39

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

  • 如果你还没有看到,这是值得的.它弹出一个疯狂的GUI. (8认同)

Saz*_*han 30

假设$COMMIT您执行前是最后一次提交ID git pull.你需要撤消最后一次拉动是什么

git reset --hard $COMMIT

.

奖金:

在谈到拉动时,我想分享一个有趣的技巧,

git pull --rebase

上面的命令是我git生活中最有用的命令,节省了大量的时间.

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

有关详细信息,请访问:http://gitolite.com/git-pull--rebase


Put*_*M S 18

current branch查看执行git pull命令的位置中的日志

git log
Run Code Online (Sandbox Code Playgroud)

示例输出将如下所示

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
Run Code Online (Sandbox Code Playgroud)

复制您想要的最后一次提交 ID。例如,如果您的最后一个提交 id 是xxxxxxxxxxxxxxxxxxxxxxxxxxxxxc0e6fa(假设此提交 id 是您执行 git pull 之前的最后一个提交 id),并且此提交 id 之上的两个提交是在您的 git pull 命令之后出现的,则使用此提交 id 来获取您之前的更改

git reset --hard xxxxxxxxxxxxxxxxxxxxxxxxxxxxxc0e6fa
Run Code Online (Sandbox Code Playgroud)

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


Saf*_*wan 17

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

git reset --hard custom-branch@{1}
Run Code Online (Sandbox Code Playgroud)

分支示例main

git reset --hard main@{1}
Run Code Online (Sandbox Code Playgroud)


Orl*_*ndo 15

你可以做 git reset --hard ORIG_HEAD

因为"pull"或"merge"将ORIG_HEAD设置为执行这些操作之前的当前状态.


Man*_*ami 13

这是恢复拉动变化的最简单方法.

git reset --hard 9573e3e0
Run Code Online (Sandbox Code Playgroud)

9573e3e0您的{提交ID} 在哪里


小智 12

尝试运行

git reset --keep HEAD@{1}
Run Code Online (Sandbox Code Playgroud)


Sly*_*tor 10

我建议做的第一件事是复制该项目。

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

运行此命令以查看 git 参考。

git reflog
Run Code Online (Sandbox Code Playgroud)

它将显示您的参考日志和 commit_Id {类似 e0371eb},您可以使用它返回到特定的参考点。

运行此命令回溯到某个点

git reset --hard 7316f34  //replace that with your commit id
Run Code Online (Sandbox Code Playgroud)

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


big*_*heo 9

这样做可以取消合并操作:git merge --abort


Dav*_*ide 7

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


saj*_*jib 6

git pull做下面的操作。

一世。 git fetch

ii. git merge

要撤消拉动,请执行任何操作:

一世。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 ) 更改。


Sag*_*r M 6

这应该撤消git pull

git reset --hard HEAD^
Run Code Online (Sandbox Code Playgroud)