如何用git处理这个补丁问题?

时间:2013-04-09 08:31:05

标签: c linux git

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

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

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

  

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

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

分支 C 中的代码是干净的,我想从中伪造补丁。补丁应包括上次提交 C A 的所有更改。

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

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

1 个答案:

答案 0 :(得分:1)

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

它会调出一个编辑器。将所有“选择”文本更改为“s”,但第一个除外。这会将所有提交“压缩”为一次提交。

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