【发布时间】:2012-05-10 12:58:22
【问题描述】:
一位新开发人员在一个大型 git 存储库上发疯了,真的把它搞砸了并推动了它。 他的所有改动都可以扔掉。
我的问题:我们的 git hoster 不允许 push --force,所以我必须先拉。
如果我这样做了,我会有很多合并和冲突,解决它们毫无意义。 恢复其他人所做的所有更改以便我可以推送当前版本的最佳方法是什么?
【问题讨论】:
一位新开发人员在一个大型 git 存储库上发疯了,真的把它搞砸了并推动了它。 他的所有改动都可以扔掉。
我的问题:我们的 git hoster 不允许 push --force,所以我必须先拉。
如果我这样做了,我会有很多合并和冲突,解决它们毫无意义。 恢复其他人所做的所有更改以便我可以推送当前版本的最佳方法是什么?
【问题讨论】:
我找到了一种方法来做我需要的事情。
我在这里为处于相同情况的其他人发布我的解决方案。 很可能有一种更简单的方法,所以如果你知道的话,请不要犹豫。
首先,提交所有更改,以便您拥有一个干净的工作目录。检查 git status 是否有任何更改。
然后,创建一个新的临时分支来存储您的更改。
git branch tmp
现在你应该找到你和远程分支分歧的最后一次提交。 您将需要提交哈希,例如 63da978a9a4620790b75dfbae86d658a65dc3e25。
找到它后,将您的主分支重置为该提交。
git reset --hard COMMIT
现在从您的遥控器中提取更改。不应发生冲突。
git pull origin master
现在您可以恢复应该被丢弃的提交。
git revert COMMIT1
如果您做的一切都正确,那么只需最后一步即可完成该过程:将您的 tmp 分支与所有更改合并。
git merge tmp
同样,不应该发生任何冲突。
您现在有一个可以再次推送的最新分支。万岁!
git push origin master
【讨论】:
有一个技巧你可以试试。
git push origin :master
这有效地删除了您名为 master 的分支。好消息是,您不需要任何权限即可执行此操作(是的,我知道,很奇怪)。
完成后,您就可以这样做了
git push origin master:master
这将完全按照您的存储库中的方式重新创建主分支。
无需处理任何冲突/合并。 永远不应该使用这个(除了你的情况,这是一个简单的方法)。
这个技巧只允许删除这个开发者所做的每一个提交(根本不会有任何痕迹)。
有一种“正常”的方式来做到这一点:
【讨论】:
为避免冲突,请勿合并(通过git pulling),只需使用git fetch。
无论如何,如果你不能使用 push --force,唯一的选择是git revert
【讨论】: