GitHub – 如何恢复到以前的状态更改

我正在使用GitHub作为我的远程存储库。

我已经推送了5个提交到服务器,并希望恢复到那些提交之前的状态。

如果提交哈希是3425661dba2aadccdbab ,我该如何将整个本地/远程恢复到该提交? 我试过了

 $ reset --hard 3425661dba2aadccdbab 

但只是重新设置了我的工作头,并要求我再次做一次git pull 。 我尝试了结帐,但是这让我在一个“独立的头”分支登陆。

基本上有两个选项来恢复更改:

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

第一个选项可以通过使用git revert来实现

git-revert – 恢复一些现有的提交

给定一个或多个现有的提交,恢复相关的修补程序引入的更改,并logging一些新的提交logging它们。

一个例子是git revert -n HEAD~5..HEAD 。 这个命令创build了5个新的提交,每个提交撤销当前签出分支的最后5个提交之一。

第二个选项是实际删除提交。 请注意,这会更改存储库中的历史logging。 所以,任何已经做出这些改变的人都可能会感到惊讶,事情会很快变得混乱。 这就是说,你可以做

 git reset --hard HEAD~5 git push --force 

第一个命令将擦除当前工作副本中的任何未提交的更改。 并将您的本地存储库重置为当前HEAD-5提交的状态。 第二个命令将强制推送到默认的远程(即GitHub)在那里,从当前的本地存储库分歧的任何变化将被覆盖。

再次警告:如果您不知道自己在做什么,请不要使用此选项,否则可能会导致您或他人的数据丢失(如果不正确)。 使用第一个选项,因为它会透明地删除更改,但没有历史重写的令人讨厌的副作用。

做一个git push -f 。 如果有其他人使用相同的回购,不是一个好主意。

你可以做git revert <commit>到所需的状态之后的所有提交。 (以相反的顺序,以避免任何冲突。)

如果有其他人共享回购,这是一个干净的方式,但有点困难。 (虽然你可以自动化…?)

做一个混帐签出,然后提交到你想要的分支。 这将使旧的代码提交一个新的提交(所以你将有6个提交)。

git checkout HEAD~3 ,其中3是你想要恢复的提交数量。

更好的是,您可以将单个文件签出到当前的HEAD中:

git checkout 3425661dba2aadccdbab:path/to/file/from/base

这样可以减less让别人生气的可能性,把你们脚下的谚语地毯拉出来。

编辑:

这里还有一个类似的问题:

签出旧的提交,并使其成为一个新的提交