2

一位新开发人员在一个大型 git 存储库上发疯了,真的把它搞砸了,然后推。他所有的改变都可以扔掉。

我的问题:我们的 git 主机不允许 push --force,所以我必须先拉。

如果我这样做,我有很多合并和冲突,解决它们毫无意义。恢复其他人所做的所有更改以便我可以推送当前版本的最佳方法是什么?

4

3 回答 3

2

我找到了一种方法来做我需要的事情。

我在这里为处于相同情况的其他人发布我的解决方案。很可能有一种更简单的方法,所以如果您知道,请不要犹豫发布。


首先,提交所有更改,以便您拥有一个干净的工作目录。检查 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
于 2012-05-10T14:55:00.147 回答
1

有一个技巧你可以试试。

git push origin :master

这有效地删除了名为 master 的分支。好消息是,您不需要任何许可即可执行此操作(是的,我知道,很奇怪)。

一旦完成,你就可以做到

git push origin master:master

这将完全按照您的存储库中的方式重新创建主分支。

无需处理任何冲突/合并。这不应该被使用(除非你的情况,这是一个简单的出路)。

该技巧允许仅删除该开发人员所做的每个提交(根本不会有任何痕迹)。


有一种“正常”的方法可以做到这一点:

  • 获取分支
  • 还原分支顶部的错误提交
  • 推动回归
  • 在分支上重新定位您的工作
于 2012-05-10T15:29:38.597 回答
0

为避免冲突,请勿合并(通过git pulling),只需使用git fetch.

无论如何,如果您不能使用 push --force,唯一的选择是git revert

于 2012-05-10T13:14:18.400 回答