撤消快进合并

时间:2013-01-13 21:48:59

标签: git

我已经对我要撤消的git仓库进行了一些更改。

我的git repo看起来像这样:

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

我在develop分支上,忘记它与master分支不同,在develop上进行了更改,将其合并到master,然后推送到我的遥控器(称为publish)。

因为自B(共同祖先)以来主人没有变化,所以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?
  • 如何将这些更改推回到远程/发布?

3 个答案:

答案 0 :(得分:74)

如果重置分支主控,则不会触及开发分支。为了按顺序重新输入所有内容,您应该:

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

答案 1 :(得分:18)

  • 假设您仍然在 master 上合并并推送
  • git reset --hard @{1}
    • 将分支“master”重置为计算机上的一步(即“B”)
  • for develop 什么都不做,因为它仍然应该是“D”
  • git push publish develop --force-with-lease=master
    • 以通常的方式推送分支“develop”
    • 并且它还向后推分支“master”,并以安全的方式通过--force-with-lease获得许可
    • 使用--force可能默默覆盖其他人的工作,所以我从不使用

答案 2 :(得分: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