如何在 git 中拆分一个巨大的合并?

How do I break up a giant merge in git?

首先我的项目是这样的:

A

然后一位开发人员做出了巨大的改变(有很多次提交):

A -> B

另一个开发者同时做了一个巨大的改变(有很多提交):

A -> B
 \
  -> C

现在我需要合并回 C。git diff 显示大约 10000 个 LOC 中大约有 5000 个在 C 与 master (B) 中不同。更不用说大量的外部库更改了。

首先,我尝试在 B 之外创建一个分支 C_merge 并在 C 中合并。这导致了一次巨大的提交,其中包含许多我解决的冲突,之后我遇到了很多编译错误。

我想尝试变基方法。我想从 C 分支出来(以防有人向 C 添加更多提交),然后在 B 上重新定位,一次通过它一次提交,并让它一直编译并通过单元测试。这可能吗?如果可以,我要执行什么命令 运行?或者有更好的方法吗?

您可以尝试使用 git rebase -i,它是在交互模式下变基的。在 git 从 C 到 B 之上进行每一次提交之前,它会给你一个选项来修改通过 git commit --amend 提交的提交。此时您还可以检查编译和 运行 您的测试套件。一旦您对提交的质量感到满意,您可以键入 git rebase --continue 以继续从 C 进行下一次提交。Git 将指导您进入交互式变基模式后的操作。

rebase 完成后,您的功能分支应如下所示:
your_feature A <- B <- C'

我已经使用上面的标签 C' 来表示来自 C 的提交已作为您的 rebase 的一部分进行了更改。

最后,要将其恢复为 master,您只需 git push origin your_feature:master。您将成为功能分支的快速转发大师(不合并)。