恢复push'd git commit

时间:2011-03-15 18:42:06

标签: git merge github reset revert

我有一个有两个分支的回购 - 主人和开发者。我正在主分公司工作并拉,并得到一个消息,说回购是最新的。我提交了我的更改,并推送到远程仓库(在github上)。我收到一条消息说有些变化被拒绝了。

然后我做了一个git pull origin dev,这显然是错误的做法 - 因为它将dev分支与我的主人合并,就像一个白痴,我没有注意到这一点,直到我再次推动。因此,最后一次提交显示Merge branch 'dev' of github.com:myuser/myrepo

我可以通过执行git reset --hard [sha]回到我本地仓库中的最后一个已知状态,其中[sha]是合并前的提交(尽管我不知道如何将更改改为原点) - 或者从我读过的内容中我也可以做git revert -m然后提交/推送那个改变。

任何人都可以通过“正确的方式”来解除我的合并,并将两个分支恢复到合并之前的位置吗?

谢谢 - 如果重要的话,这只是一个只有两个开发人员的共享仓库,所以它没有发生重大变化。

编辑添加:请跟我说话,好像我还是个孩子。我不得不承认这个Git的东西仍然让我困惑,所以我远远不是一个超级用户!感谢

2 个答案:

答案 0 :(得分:20)

git reset --hard [sha]将更正本地存储库中的分支。要强制此推送工作,您可以执行git push origin +master:master。 +符号将强制非线性推动工作。

如果其他开发人员已经提交错误提交,则必须执行git remote update,然后执行git reset --hard origin/master(前提是他们在主分支上,并且未进行任何其他提交

请谨慎使用这些命令:-)。祝你好运。

答案 1 :(得分:2)

FelipeFG的答案在双开发人员环境中运行良好,您可以轻松地协调重做另一个人的本地存储库,但实际上您最好使用git revert -m<parent id of mainline branch, 1 in this case> <commit ref>。然后,当您完成修复后,只需git revert <revert commit>git merge dev(在这种情况下还原您的还原很重要,因为否则git merge dev将不会将您的旧合并视为祖先,这将导致必须解决的冲突。

历史将是丑陋的,但它也将支持快速转发,并且由于你的历史修订,你不必担心一些糟糕的闷棍纠缠一堆局部冲突。

有关详细信息,请参阅http://opensource.apple.com/source/Git/Git-26/src/git-htmldocs/howto/revert-a-faulty-merge.txt