【问题标题】:How to update a single patch from withing a patchset?如何从补丁集中更新单个补丁?
【发布时间】:2017-10-03 10:16:37
【问题描述】:

我想知道如何更新作为补丁集的一部分并且已经提交到开源项目的补丁?

网上的教程提到使用--amend,但要修复的补丁不是最后一个,而是5个中的第2个。

另外,我想确定...我应该再次提交整个补丁集还是只提交已修复的补丁集?

  • 附加信息:补丁集适用于 U-Boot,使用求职信创建,编号如下: git format-patch -o /home/sam/patchset --cover-letter -n --thread=shallow 0b9c250^..fd3c12d

谢谢。

【问题讨论】:

    标签: git open-source patch u-boot


    【解决方案1】:

    具体细节可能会因收件人的偏好而略有不同。作为一般规则,如果您需要修改补丁集,请提交 new 补丁集、“[v2] ...”(版本 2)、“v3”等.在“00/NN”条目中提供更新的(累积)描述也很好。您还可以在各个补丁中的剪切线部分之间添加说明性文本:

    Subject: [PATCH v5 07/11] foo/blah: frobulate the mizzenbeast
    ...
    
    ... descriptive text about the patch extracted from a commit message ...
    
    Signed-off-by: A U Thor <thor@example.com>
    ---
    We can sneak in a bit more information here.  This will not get
    added to the commit.
    
      dir/sub/some.ext                 |  3 ++
      ...
    diff --git ...
    

    由于这些补丁集实际上只是电子邮件,您可以在这里完全停止使用 Git。然而,这样做是困难的(至少在我看来)。

    由于新的补丁集是一组新的电子邮件消息,并且您可能希望保留现有的工作,处理此问题的方法在 Git 本身是创建一个新分支.

    假设以上是您的mizzenbeast 分支中的一系列补丁。我处理这个问题的方法是重命名该分支mizzenbeast-v1 并创建一个新分支mizzenbeast-v2。然后,您可以git cherry-pick 每次提交一个,直到找到需要更改的那个。此时您可以git cherry-pick -n 需要更改的提交。

    现在,在您的索引和工作树中,所有内容都已暂存并准备好提交,但实际上并未提交。现在您可以进行任何您喜欢的更改,git add 他们,git commit 结果。

    您现在已准备好继续挑选任何未更改的提交,解决因您所做更改而发生的任何冲突。完成后,您的 mizzenbeast-v2 分支将包含新的提交系列,准备好将 git format-patch 作为 [PATCH v2 nn/howmany] 发送到邮件列表以供审核。

    (请注意,您仍然需要手动修改格式化补丁的文本,以插入 v2 和任何额外信息。)

    让自己更轻松地完成这项工作

    有一种更快更简单的方法来挑选所有内容并对其进行修改:使您的新分支 (mizzenbeast-v2) 指向重命名的 (mizzenbeast-v1) 分支的尖端提交,以便两个分支相同。然后运行git rebase -i &lt;hash or identifier of where to start&gt;。这会在一系列pick 命令上打开您的编辑器,这些命令告诉 Git 执行与您手动执行的相同的樱桃选择。将一个或多个更改为edit,写出文件,然后退出编辑器。 Git 现在将成为挑选过程,就像上面一样。然而,当它到达edit 时,它会挑选提交——这次没有 -n——然后停止。

    现在您可以进行更改并使用git commit --amend 替换当前(匿名)mizzenbeast-v2-in-progress 分支提示提交。这与您在使用 git cherry-pick -n 时所做的类似,只是您将当前提交推到一边,而不仅仅是添加一个新提交。

    完成后,您可以运行 git rebase --continue 来告诉 Git 继续执行保存的采摘指令。如果一切顺利,它将完成它们并将mizzenbeast-v2 分支标签移动到新分支的尖端。如果出现问题(由于在此过程中修改提交而导致的冲突),您将不得不再次修复它,git addgit rebase --continue

    (我建议等到你用“艰难的方式”完成它之后再使用这个“更简单”的过程,手动挑选每个提交,至少一次或两次。原因是虽然这可以自动完成这项工作,但很难判断发生了什么。如果出现问题 - 并且事情出错 - 清楚地了解 Git 在做什么以及您需要做什么是非常有帮助的现在就修复它。)

    【讨论】:

    • 非常感谢,这个答案很有帮助。但是,仍然不清楚我可以在哪一步编辑代码中的更改(就像我通常使用 git commit -a 所做的那样)?因为,将“pick”替换为“edit”只会更改提交消息。
    • 在您掌握cherry-pick 版本之前,请勿使用rebase -i 版本,在该版本中使用git cherry-pick -n。然后,作为中间步骤,尝试将git cherry-pick -n + work + git add ...; git commit 序列替换为git cherry-pick + work + git add ...; git commit --amend。然后你就可以使用git rebase -iedit 命令了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    相关资源
    最近更新 更多