如何在Git中合并后重新格式化补丁?

5

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

foo bar

然后在分支slave中进行编辑,以使其成为:

foo bar baz

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

foo bar spam eggs

补丁无法应用,需要让“主”请求“从”合并并创建一个新的补丁。当“主”合并到“从”并解决了冲突后,就需要重新格式化补丁。提交图形看起来像这样:
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可以格式化一个有效的补丁,但省略了提交信息。
1个回答

1

你为什么要使用补丁?你应该在仓库之间推送和拉取。

合并不是可以从中制作补丁的东西。它只会遵循第一个父级。你可以通过使用 git diff 并格式化为补丁,同时指定两个不同的提交来获取你想要的。

希望这可以帮到你。


我使用补丁,因为这是上游想要的,而我无法控制工作流程。我必须格式化补丁,考虑到冲突解决,因为我也发布我的存储库,不能变基。不幸的是,“git diff”不包括提交消息。 - sastanin
有一种方法可以使合并只有一个父节点。从那个补丁中可以得到你所需的结果。 - Adam Dymitruk
一个只有一个父节点的合并操作?怎么可能? git-merge 不是应该“将两个或多个开发历史记录合并”吗? - sastanin
你可以尝试使用--squash选项,它将创建一个合并的单一提交,但这样你就失去了遍历合并回原始分支的能力。 - Chris Nicola

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接