GitHub - 如何将更改还原到以前的状态

时间:2011-08-07 08:54:24

标签: git github repository commit revert

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

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

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

$ reset --hard 3425661dba2aadccdbab

但这只是将我的工作头重新设置为该分支,并要求我再次执行git pull。我试过结帐,但这导致我降落在一个“独立的头”分支。

4 个答案:

答案 0 :(得分:60)

您基本上有两个选项可以还原更改:

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

    可以实现第一个选项
      

    git-revert - 还原一些现有的提交

         

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

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

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

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

执行git checkout,然后将其提交到所需的分支。这将使用旧代码进行新的提交(因此您将有6次提交)。

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

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

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

这将减少让别人生气的可能性,让你从他们的脚下拉出众所周知的地毯。

编辑:

这里有一个类似的问题:

Checkout old commit and make it a new commit

答案 3 :(得分:2)

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

如果有其他人分享回购,这是一种干净的方式,但有点努力。 (你可以自动化......?)