我使用 GitHub 作为我的远程存储库。
我已经向服务器推送了 5 个提交,并希望恢复到这些提交之前的状态。
如果提交哈希是3425661dba2aadccdbab
,我如何将整个本地/远程恢复到该提交?我试过
$ reset --hard 3425661dba2aadccdbab
但这只会让我的工作头重新回到那个分支,并且需要我再做git pull
一次。我尝试结帐,但这导致我降落在一个“分离的头”分支。
我使用 GitHub 作为我的远程存储库。
我已经向服务器推送了 5 个提交,并希望恢复到这些提交之前的状态。
如果提交哈希是3425661dba2aadccdbab
,我如何将整个本地/远程恢复到该提交?我试过
$ reset --hard 3425661dba2aadccdbab
但这只会让我的工作头重新回到那个分支,并且需要我再做git pull
一次。我尝试结帐,但这导致我降落在一个“分离的头”分支。
您基本上有两个选项可以还原更改:
第一个选项可以通过使用来实现git revert
git-revert - 恢复一些现有的提交
给定一个或多个现有提交,还原相关补丁引入的更改,并记录一些记录它们的新提交。
一个例子是git revert -n HEAD~5..HEAD
。此命令创建 5 个新提交,每一个都撤消当前签出分支的最后 5 个提交之一。
第二种选择是实际删除提交。请注意,这会更改存储库中的历史记录。因此,任何已经进行更改的人都可能会感到相当惊讶,事情很快就会变得一团糟。也就是说,你可以做到
git reset --hard HEAD~5
git push --force
第一个命令将擦除当前工作副本中所有未提交的更改。并将本地存储库重置为当前 HEAD - 5 次提交的状态。第二个命令将强制推送到默认远程(即 GitHub)那里,任何与当前本地存储库不同的更改都将被覆盖。
再次警告:如果您真的不知道自己在做什么,请不要使用此选项,因为如果操作不当,可能会导致您或其他人的数据丢失。改用第一个选项,因为它会透明地删除更改,但没有历史重写的讨厌的副作用。
您可以git revert <commit>
对在所需状态之后所做的所有提交进行操作。(以相反的顺序以避免任何冲突。)
如果有其他人共享 repo,这是一种干净的方式,但有点费力。(虽然你可以自动化......?)
做一个git push -f
。如果有其他人使用相同的存储库,这不是一个好主意。
执行 git checkout,然后将其提交到您想要的分支。这将使用旧代码进行新的提交(因此您将有 6 个提交)。
git checkout HEAD~3
,其中 3 是您想要恢复的提交次数。
更好的是,您可以将单个文件签出到当前的 HEAD 中:
git checkout 3425661dba2aadccdbab:path/to/file/from/base
这将减少让其他人生气的可能性,因为你把众所周知的地毯从他们脚下拉出来。
编辑:
这里有一个类似的问题: