如果您已经将内容推送到远程服务器(并且您有其他开发人员在同一个远程分支中工作),则要牢记的一点是您不想重写历史记录
不要使用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之类的工具以一致的方式自动创建分支。