我有一个有两个分支的回购 - 主人和开发者。我正在主分公司工作并拉,并得到一个消息,说回购是最新的。我提交了我的更改,并推送到远程仓库(在github上)。我收到一条消息说有些变化被拒绝了。
然后我做了一个git pull origin dev
,这显然是错误的做法 - 因为它将dev分支与我的主人合并,就像一个白痴,我没有注意到这一点,直到我再次推动。因此,最后一次提交显示Merge branch 'dev' of github.com:myuser/myrepo
。
我可以通过执行git reset --hard [sha]
回到我本地仓库中的最后一个已知状态,其中[sha]是合并前的提交(尽管我不知道如何将更改改为原点) - 或者从我读过的内容中我也可以做git revert -m
然后提交/推送那个改变。
任何人都可以通过“正确的方式”来解除我的合并,并将两个分支恢复到合并之前的位置吗?
谢谢 - 如果重要的话,这只是一个只有两个开发人员的共享仓库,所以它没有发生重大变化。
编辑添加:请跟我说话,好像我还是个孩子。我不得不承认这个Git的东西仍然让我困惑,所以我远远不是一个超级用户!感谢
答案 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。