撤销快进合并

我对 Git 回购协议做了一些修改,我想撤销它。

我的 Git 回购看起来像这样:

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。

根据我在 如何撤消 Git 中的最后一次提交?中读到的内容,我使用 git reset sha-of-B将我的 master分支恢复到修订版 B。

问题:

  • 如何将 develop恢复到修订本 D?
  • 然后如何将这些更改推回到远程/发布?
37102 次浏览

如果您重置了分支主机,它就不会碰到显示分支。为了按顺序排列,你应该这样做:

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

如果你似乎被签出到 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
  • 想象一下你仍然在 师父上合并并推动
    • 这会将分支 师父重置为在计算机上的后退一步(即在“ B”)
  • 对于 开发什么都不做,因为它应该仍然在“ D”
    • 这会以通常的方式推动 “发展”分支
    • 向后推动分支 师父,通过 --force-with-lease以安全的方式获得许可
    • 使用 --force可能会覆盖别人的工作, 所以我从来不用那个
  • 或者两个 push 操作一起使用这种令人惊讶的语法:
    • git push publish develop --force-with-lease=master