2

我目前正在使用 git 做一个项目。基本上,我的 git 树由三个分支组成:

  • 分支A:起源分支,我的工作就是从它衍生出来的。
  • 分支B:基于 A 的分支B包含开发工作(A的新功能)。
  • C分支:出于时间管理的原因,我还开始为新功能开发不完整的实验选项。此实验代码直接添加到B中。所以C是B的清理分支,只保留完全可操作的代码。

分支关系可以用这种方式表示:

A -> B ->提交 0 -> ... ->提交 n -> C ->清理提交

分支B包含所有新功能的代码,有时与仍在开发中的可选部分混合。C中的所有提交都是对实验部分的删除。

分支C中的代码是干净的,我想从中伪造一个补丁。该补丁应包括从C的最后一次提交到A的头部的所有更改。

如果我这样做git format-patch master --stdout > my_patch.patch了,这会产生一个补丁,该补丁将有效地以操作代码结束。但这并不好,因为在补丁中,添加了实验代码(通过B中的一些提交)然后删除(清理C中的提交)。除了一点都不聪明之外,这还包括无用的额外空间(这意味着与社区共享补丁的额外邮件)和应用程序的额外开销。

我应该如何对这些分支进行操作以生成干净的补丁?请注意,我想保留迄今为止在分支B中所做的实验工作,我只是不想将其包含在补丁中。

4

1 回答 1

1
git checkout C              # alternately, do "git checkout -b C_NEW" for safety
git rebase --interactive A  # Your A branch

它会弹出一个编辑器。将除第一个之外的所有“pick”文本更改为“s”。这会将您的所有提交“压缩”到一个提交中。

您也可以使用cherry-pick(将一些提交拉出到A上),或 git rebase --interactive (并删除所有B提交以获得C)。

于 2013-04-15T03:27:00.823 回答