您可以使用git revert 恢复合并。请注意,当您这样做时,会使未来的“重新合并”变得更加困难。阅读您紧密链接的那条消息-它说了很多关于如何使未来“重新合并”工作的信息-但请注意,它正在谈论将develop合并到master,而您说您做了相反的事情,合并@ 987654324@转develop:
A -- B -- C -- D -- E <-- master
\ \
F - G - H - M <-- develop
在这种情况下(将 master 合并到 develop 中,而不是相反),您可以选择许多不同的选项,它们各有优缺点...
最简单的方法,如果可以的话我更喜欢
(0) 什么都不做。如果合并C 和D 不会破坏develop 分支,那么就这样吧。稍后,有人会 git checkout master 和 git merge --no-ff develop 并得到这个(假设先将另一个提交 I 添加到 develop):
A -- B -- C -- D -- E -- M2 <-- master
\ \ /
F - G - H - M - I <-- develop
在这里,merge 查找在 develop 中所做的事情,因为它从 master 中分离出来,在 B。所以它放入F、G 和H,跳过M 的任何从master 脱落的部分(可能是所有部分),最后放入I 并进行合并提交@ 987654347@(因为提交E;但如果E不存在,那是因为我也使用了--no-ff)。
一些简单但缺点明显的方法
(1) 只是“重写历史”:从分支develop 中删除提交M。提醒所有使用该分支的其他人这即将发生:提交 M 正在消失,他们应该采取任何必要措施来处理这个问题。
(2) 停止使用旧名称develop,改用新分支名称develop1 或其他名称:
A -- B -- C -- D -- E <-- master
| \
| M <-- develop
\ /
F - G - H <-- develop1
这与选项 (1) 相同,只是提交 M 仍然存在,以及它上面的分支标签,并且您有一个新的/不同的分支标签指向提交 H。您仍然需要提醒每个人,但这可能会使他们的工作更轻松。你可以稍后删除develop,当每个人都同意时。
还原及其缺点
(3) 恢复合并。和链接的文章一样,让我们使用W 来表示新的revert commit:
A -- B -- C -- D -- E <-- master
\ \
F - G - H - M - W <-- develop
W 中有什么内容?不管需要什么来“消除合并的影响”。在这种情况下,这意味着更改会取消在C 和D 中所做的任何事情。到目前为止一切顺利,develop 又一次有了来自F、G 和H 的变化。问题出现稍后,如果/当有人这样做时:
git checkout master
git merge develop
第二个命令查找master 和develop 的拆分位置,即提交B,因此它会获取从那时起的所有更改。此时包括W 中的那些,它们将un-执行C 和D,完全不是你想要的。之后可以修复它,但无论谁进行合并,都必须知道这个“删除C 和D”的定时炸弹等着他们。
请注意,这与“什么都不做”选项 (0) 中的合并相同。这里的问题是W 的内容。在情况 (0) 中,您想要提交 I 的内容,但在这里您不想要 W 的内容。
另一种选择
考虑到上面显示的内容,这可以说是最糟糕的选择,但我还是会列出它:
(4) 使用您想要保留的提交的 副本 创建一个全新的分支,并将其命名为 develop。 (或将其命名为其他名称,但随后我们又回到了上述develop1 类似的情况,您可能应该只使用那个。)无论您是保留old-develop 分支,还是放弃它(通过不标记它),取决于你,但我会把它画进去:
F' - G' - H' <-- develop
/
A -- B -- C -- D -- E <-- master
\ \
F - G - H - M <-- old-develop
这在您包含的链接中有所描述。它只在更复杂的情况下才真正有用。