如何对同一个git修订版应用两个补丁?

时间:2011-03-07 15:07:25

标签: git patch

这是一个想象中的问题,但我遇到了补丁的真正问题。假设我有一个包含以下git历史的项目:

A - B - C

现在,如果我收到两个补丁C1C2,这些补丁适用于C,我该如何处理?如果我首先应用补丁C1,那么我将无法应用补丁C2,因为存储库已成为:

A - B - C - C1

是否可以同时应用它们,或者我是否必须回复发送C2的人告诉他/她更新补丁?

现在假设我离线工作并提交以便存储库变为:

A - B - C - D - E

然后我查看我的电子邮件并收到C的补丁。 同样,是否可以简单地应用该补丁,或者我是否需要更新补丁?

3 个答案:

答案 0 :(得分:8)

经典的方法是:

  • 应用收到的第一个补丁,
  • 拒绝任何不快进的补丁,并要求发件人先重新设置他/她的回购,然后重新检查补丁,然后重新发送。

一般的想法是,您无法解决合并冲突:只有补丁的创建者具有解决与当前源代码冲突的必要知识。

Linus Torvalds(Git的创造者)在his 2007 Google talk中说:

  

所以会发生什么,请记住,分配意味着没有人是特别的   所以不是我合并,我只是推出我的第一棵树,没有任何合并问题,我告诉第二个人:

     “嘿,我试图从你那里撤走,但是我发生了合并冲突,并且它们并不是完全无关紧要的,所以我决定让你取得荣誉。”

     

他们这样做。他们知道自己在做什么,因为这是他们的变化。所以他们可以做合并,他们可能认为我是一个白痴,因为合并是如此简单,很明显我应该采取他们的代码,但他们做合并,他们更新他们的树,并说“嘿,你能拉现在从我这里来,“我从他们那里拉出来,他们为我做了所有的工作。

     

这就是全部:他们为我做了所有工作。所以,......我认可。现在我只需要弄清楚第3步:利润

答案 1 :(得分:5)

大多数情况下,C2将适用于C1。只有当他们对相同文件的重叠部分进行编辑时,才会出现合并冲突。 Git将采用冲突的补丁的所有部分,并插入可帮助您解决合并的冲突标记。

至于做什么,这取决于你的项目有多大以及你在这部分代码中的能力 - 我总是自己解决冲突,只要提交者使用了合理的近期结账作为补丁的基础。

另一位评论者提到莱纳斯的话说他总是让其他人解决冲突,但即便如此也是如此;他经常要求人们在发送拉动请求时留下未解决的冲突,这样他就可以对他们进行射击。

答案 2 :(得分:3)

您完全可以尝试来应用所有这些补丁。您可能会遇到合并冲突,并且正如VonC建议的那样,您可能希望补丁提交者解决它们,或者您可以像cjb所说的那样自己完成!在任何情况下,这都是你想要做的。

第一种情况:两个补丁,C1和C2。

# apply C1
git am C1.patch
# create a temporary branch (use a real name instead of C2)
git checkout -b C2 C
# apply C2
git am C2.patch
# return to master
git checkout master
# merge the other branch
git merge C2
# and delete the other branch
git branch -d C2

你可以类似地处理第二种情况;只是不是应用C1而是你自己提交了D和E。

当然,如果合并失败了,你看起来太可怕了,你可以把它吹走,并告诉C2的提交者将其修复到最后。 (git reset --merge; git branch -D C2