我使用GitHub作为我的远程存储库。
我已经向服务器推送了5次提交,并希望恢复到提交之前的状态。
如果提交哈希为3425661dba2aadccdbab
,如何将整个本地/远程恢复为该提交?我试过了
$ reset --hard 3425661dba2aadccdbab
但这只是将我的工作头重新设置为该分支,并要求我再次执行git pull
。我试过结帐,但这导致我降落在一个“独立的头”分支。
答案 0 :(得分:60)
您基本上有两个选项可以还原更改:
使用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
这将减少让别人生气的可能性,让你从他们的脚下拉出众所周知的地毯。
编辑:
这里有一个类似的问题:
答案 3 :(得分:2)
您可以git revert <commit>
执行所需状态之后的所有提交。 (以相反的顺序避免任何冲突。)
如果有其他人分享回购,这是一种干净的方式,但有点努力。 (你可以自动化......?)