2011-03-15 91 views
10

我有一个回购两个分支 - master和dev。我正在主分支上工作,并且收到一条消息,表示回购是最新的。我承诺我的更改,并推到远程回购(在github上)。我收到一条消息,说有些更改被拒绝。恢复push'd git承诺

然后我做了一个git pull origin dev,这显然是错误的做法 - 因为它将开发分支与我的主人合并在一起,并且像一个白痴,直到我再次推动为止,我才注意到这一点。所以上次提交显示Merge branch 'dev' of github.com:myuser/myrepo

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

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

感谢 - 如果它很重要这是一个只有两个开发人员的共享回购,所以它不会发生重大变化。

修改添加:请跟我说话,好像我还是个孩子。我不得不承认,这个Git的东西仍然让我困惑,所以我远离了高级用户!谢谢

回答

20

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

如果其他开发商已经拉你错了承诺,他们将不得不做一个git remote update,然后git reset --hard origin/master(前提是他们在自己的主分支,并没有作出任何其他的提交。

请使用这些命令有一些小心:-)。祝你好运。

+0

危险但如果只有两个开发人员,我认为没关系。在做这件事之前备份至少一份你的回购可能是有意义的,以防万一你搞砸了。 – 2011-03-15 19:03:06

+0

git push origin master -f – 2011-03-15 19:18:58

+0

谢谢felipefg--看起来像完美的工作!我赞赏清楚的答案。 – julio 2011-03-15 20:14:51

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不会将您的旧合并视为祖先,这将导致需要解决的冲突) 。

历史将是丑陋的,但它也将支持快速转发,并且您不必担心由于您的历史修订而导致一些可怜的SAP解决方案混乱局部冲突。

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