如果您已经将内容推送到远程服务器(并且您有其他开发人员在同一个远程分支上工作),那么要记住的重要一点是您不想重写历史记录
不要使用 git reset --hard
您需要还原更改,否则任何在其历史记录中已删除提交的签出都将在下次推送时将它们添加回远程存储库;并且任何其他结帐将在此后的下一次拉动中将它们拉入。
如果您尚未将更改推送到遥控器,则可以使用
git reset --hard <hash>
如果您已推送更改,但确定没有人拉取更改,您可以使用
git reset --hard
git push -f
如果您已推送更改,并且有人将其拉入结帐,您仍然可以这样做,但其他团队成员/结帐需要协作:
(you) git reset --hard <hash>
(you) git push -f
(them) git fetch
(them) git reset --hard origin/branch
但总的来说,这会变成一团糟。所以,还原:
要删除的提交是最新的
这可能是最常见的情况,你做了一些事情——你把它们推出来,然后意识到它们不应该存在。
首先,您需要确定要返回的提交,您可以这样做:
git log
只需在更改之前查找提交,并注意提交哈希。-n
您可以使用以下标志将日志限制为最近的提交:git log -n 5
然后将您的分支重置为您希望其他开发人员看到的状态:
git revert <hash of first borked commit>..HEAD
最后一步是创建您自己的本地分支以重新应用您恢复的更改:
git branch my-new-branch
git checkout my-new-branch
git revert <hash of each revert commit> .
继续工作my-new-branch
直到完成,然后将其合并到您的主要开发分支中。
要删除的提交与其他提交混合在一起
如果您要还原的提交不是全部在一起,那么单独还原它们可能是最简单的。再次使用git log
查找要删除的提交,然后:
git revert <hash>
git revert <another hash>
..
然后,再次创建您的分支以继续您的工作:
git branch my-new-branch
git checkout my-new-branch
git revert <hash of each revert commit> .
再一次,当你完成时,破解并合并。
你应该最终得到一个看起来像这样的提交历史my-new-branch
2012-05-28 10:11 AD7six o [my-new-branch] Revert "Revert "another mistake""
2012-05-28 10:11 AD7six o Revert "Revert "committing a mistake""
2012-05-28 10:09 AD7six o [master] Revert "committing a mistake"
2012-05-28 10:09 AD7six o Revert "another mistake"
2012-05-28 10:08 AD7six o another mistake
2012-05-28 10:08 AD7six o committing a mistake
2012-05-28 10:05 Bob I XYZ nearly works
更好的方式®
尤其是现在您已经意识到多个开发人员在同一个分支中工作的危险,请考虑始终在您的工作中使用功能分支。这意味着在分支中工作直到完成某些事情,然后才将其合并到您的主分支。还可以考虑使用git-flow等工具以一致的方式自动创建分支。