如何将 GitHub 上的更改还原到先前状态

43
我正在使用GitHub作为我的远程代码库。 我已经向服务器推送了5个提交,并希望将所有内容还原到这些提交之前的状态。 如果提交哈希值是3425661dba2aadccdbab,那么如何将整个本地/远程回滚到该提交呢?我尝试过。
$ reset --hard 3425661dba2aadccdbab

但这只是将我的工作头重置到了那个分支,并需要我再次执行 git pull。我尝试了 checkout,但这使我陷入了“分离的头”分支。


需要加上 Github 标签吗?它似乎并不是特定于 Github 的。 - Nick
4个回答

67

您基本上有两种选择来撤销更改:

  1. 创建一个新的提交以应用反向更改。这是首选选项,因为它不会更改公共存储库中的历史记录。
  2. 删除提交并强制推送它们。

第一种选项可以通过使用 git revert 实现。

git-revert - 撤消某些现有提交

给定一个或多个现有的提交,撤消相关补丁引入的更改,并记录一些新的提交记录它们。

例如,git revert -n HEAD~5..HEAD。此命令将创建5个新提交,每个提交都会撤消当前检出分支的最后5个提交之一。

第二个选项是实际删除提交。请注意,这会更改存储库中的历史记录。因此,已经拉取更改的任何人可能会感到惊讶,事情可能会很快变得混乱。尽管如此,您可以执行以下操作:

git reset --hard HEAD~5
git push --force
第一条命令将删除您当前工作副本中的任何未提交更改,并重置您的本地存储库为当前HEAD - 5个提交的状态。第二条命令将强制推送到默认远程(i.e. GitHub)上,覆盖任何与您当前本地存储库不同的更改。
再次警告一下:如果您不知道自己在做什么,请不要使用此选项,否则可能会导致数据丢失。相反,请使用第一种选项,它可以透明地删除更改,但没有历史重写的副作用。

你能解释一下 HEAD~5..HEAD 是什么意思吗? - Rutger Hofste
3
它描述了在HEAD(即当前检出的提交)和HEAD之前5个提交之间的提交范围。因此,git revert将为最后5个提交创建还原提交。类似地,git reset命令将把当前分支向后移动5个提交。有关如何为命令指定相对提交的详细说明,请参阅此博客文章 - Holger Just

4

如果有其他人共享代码库,则可以使用git revert <commit>反转到所需状态之后的所有提交。(为避免冲突,以相反的顺序进行。)

这是一种干净的方法,但需要一些努力。(您可以自动化处理...?)


3

执行 git push -f 命令。如果有其他人正在使用相同的代码库,则不是一个好主意。


我认为原帖作者有其他人在使用同一个代码库。 - meow
Git rebase之后再push,这会让他们更生气。=) - beatgammit
是否可以强制将推送限制在特定分支上? - cynistersix
1
@cynistersix git push -f 远程仓库名称 你的私有分支名称 - Chandra Sekar

2
进行git checkout,然后将其提交到您想要的分支。这将创建一个新的提交,其中包含旧代码(因此您将拥有6个提交)。 git checkout HEAD~3,其中3是您想要还原到的提交数。
更好的方法是,您可以将单个文件检出到当前HEAD: git checkout 3425661dba2aadccdbab:path/to/file/from/base 这将降低使其他人生气的可能性,因为您会在他们脚下拉开比喻性的地毯。
编辑:
这里有一个类似的问题: 检查旧提交并将其作为新提交

嗯,但正如 OP 所说,如果使用 git checkout 命令,他将会进入“游离头”分支。我之前也遇到过这个问题 ;) - meow

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