【问题标题】:How to handle this patch issue with git?如何用 git 处理这个补丁问题?
【发布时间】:2013-04-09 08:31:05
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

  • 您没有使用cherry-pick的具体原因是什么?
  • @MohamedTarek 你建议我创建一个从 A 派生的新分支,然后挑选 B 中应用的更改?我说得对吗?
  • 这个答案可能是相关的,stackoverflow.com/a/1624723
  • @Rerito 其实我的意思是,与其从 C 生成一个补丁来应用到 A,你只需挑选你想要的提交从 CA,并保持分支 B 不变。

标签: c linux git


【解决方案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)。

【讨论】:

  • 事实上,我在每个“灰色”提交中使用了git rebase -igit reset HEAD~ 的组合来拆分它们,然后使用“壁球”技巧。我一直在寻找一个能让我免于手忙脚乱的答案,但是嘿......如果我把事情搞砸了,我不会指望他们会自己解决问题。无论如何,由于您的回答很好地描述了我遵循的程序,我接受了它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-21
  • 1970-01-01
  • 2011-01-14
  • 2014-12-27
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
相关资源
最近更新 更多