2013-01-13 46 views
36

我对我的git repo进行了一些更改,希望将其撤销。撤销快进合并

我的混帐回购协议是这样的:

A-B----  master 
    \ /
    C-D  * develop 

我在develop分支,忘记它从master分支不同,在develop做出了改变,把它合并进master,然后推到我的远程(称为publish)。

因为从B(共同祖先)开始,master没有变化,所以git做了一个快进合并。

现在,我的回购协议是这样的:

A-B-C-D master, develop, remotes/publish/master, remotes/publish/develop. 

我想恢复上次合并,恢复master到B.

从我在读How to undo last commit(s) in Git?,我用git reset sha-of-B恢复我的master分支版本B.

问题:

  • 如何将develop恢复到修订版D?
  • 然后我如何将这些变化推回到远程/发布?
+0

博客文章总结并详细介绍了我所做的,应该做的以及我如何解决这个问题:http://www.capnfabs.net/software/git-undoing-a-fast -forward合并,时-you-shouldve-just-used-a-new-branch/ –

+1

@SnowCrash更新链接:http://capnfabs.net/blog/2013/01/14/git-undoing-a-fast-forward-merge/ –

+0

对于唯一的开发者来说,这可能是好的,但对于那些合作,使用'revert'而不是'reset'更合理? – Snowcrash

回答

60

如果您重置分支主机,它将不会触及开发分支。为了reput为了一切,你应该做的:

git checkout master 
git reset --hard sha-of-B 
git checkout develop 
git reset --hard sha-of-D 
git checkout master 
git merge develop --no-ff 
+0

感谢您的支持 - 本地git回购现在处于有序状态。我怎样才能推动这些更改,而不会因为'推送分支提示位于其远程对象之后而拒绝更新'而导致错误? –

+3

啊,只要强制推'git push --force' –

+0

这似乎已经解决了它的问题。非常感谢您的帮助@SimonBoudrias! –

0

如果看来你被检查出develop当您运行git reset,这就是搞砸你。

您可以修复develop如下:

git checkout develop 
git merge --ff-only D 

现在,你可以回到恢复master到B:

git checkout master 
git reset --hard B 

你回develop和推:

git checkout develop 
git push develop 
+0

感谢您的回答!我当然是在'master'分支,我只是读了'gitk' gui错误。我会相应地编辑我的问题。 –

12
  • 想象你还在上在那里你合并,并推
  • git reset --hard @{1}
    • 这个重置分支“主人”到它是退一万步你的电脑上(即在“B”)
  • 发展什么也不做,因为它仍然应该在“d”
  • git push publish develop --force-with-lease=master
    • 这个推分支“发展”在通常的方式
    • 它也是推分支“大师”倒退,通过--force-with-lease以安全的方式获得许可
    • 使用--force威力默默地从他人覆盖的工作,所以我从来没有使用
+1

“git reset --hard @ {1}”对我的情况非常合适。我 - 没有合并,它有100多个提交,并且不想为每个提交软复位。谢谢! +1 –

+0

我无意中做了一个'git checkout develop && git merge -'而不是'git checkout develop && git merge --no-ff -'( - 表示最后一个分支)。上面的答案对我来说工作得非常好,因为我之间没有做任何事情,并且仍在开发中:'git reset --hard @ {1} && git merge --no-ff feature/my-feature-branch' –