【问题标题】:How to re-format the patch after merge in Git?在 Git 中合并后如何重新格式化补丁?
【发布时间】:2011-09-17 13:22:55
【问题描述】:

假设有两个分支,masterslave,它们编辑同一个文件和同一行。最初,文件的内容是

foo bar

然后在分支slave它被编辑成

foo bar baz

现在分支slave 的用户格式化补丁(git format-patch master)并将其发送给分支master 的用户。同时,在master分支中编辑了同一个文件,变成了

foo bar spam eggs

补丁无法应用,master 要求slave 合并并制作新补丁。当master 合并到slave 并解决冲突时,是时候重新格式化补丁了。提交图如下所示:

slave:               master:

foo bar baz spam eggs
    |             \
    |              \
    |                foo bar spam eggs
    |                    |
foo bar baz              |
       \                 |
        \                |
         +---------  foo bar

slave 上的最新提交(合并)如下所示:

@@@ -1,1 -1,1 +1,1 @@@
- foo bar baz
 -foo bar spam eggs
++foo bar baz spam eggs

但是,如果我们现在运行 git format-patch master,我们仍然会得到与以前完全相同的补丁,其中不考虑合并和冲突解决:

@@ -1 +1 @@
-foo bar
+foo bar baz

如何格式化适用于最新母版的补丁?我想不使用rebase

更新:git format rev1..rev2,其中rev1rev2 分别是mastercustom 分支的负责人,不包括与冲突解决相关的更改。 git-diff 格式化一个有效的补丁,但忽略提交消息。

【问题讨论】:

    标签: git merge format-patch


    【解决方案1】:

    为什么要使用补丁?你应该在回购之间推拉。

    合并不是你可以用来制作补丁的东西。它只会跟随第一个父母。你可以通过使用git diff 和格式化补丁来获得你想要的,同时指定 2 个不同的提交来区分。

    希望这会有所帮助。

    【讨论】:

    • 我使用补丁,因为这是上游想要的,我不受工作流的控制。我必须格式化考虑到冲突解决的补丁,因为我也发布了我的 repo 并且不能 rebase。不幸的是,git diff 不包含提交消息。
    • 有一种方法可以使合并只有一个父级。从中获得的补丁将为您提供所需的结果。
    • 只与一个父级合并?这怎么可能? git-merge 不是应该“将两个或更多的开发历史结合在一起”吗?
    • 您可以尝试 --squash 它将创建一个合并的单个提交,但随后您将失去将合并遍历回原始分支的能力。
    猜你喜欢
    • 2023-03-06
    • 2014-12-27
    • 2011-01-18
    • 2012-09-30
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    相关资源
    最近更新 更多