这是一个想象中的问题,但我遇到了补丁的真正问题。假设我有一个包含以下git历史的项目:
A - B - C
现在,如果我收到两个补丁C1
和C2
,这些补丁适用于C
,我该如何处理?如果我首先应用补丁C1
,那么我将无法应用补丁C2
,因为存储库已成为:
A - B - C - C1
是否可以同时应用它们,或者我是否必须回复发送C2的人告诉他/她更新补丁?
现在假设我离线工作并提交以便存储库变为:
A - B - C - D - E
然后我查看我的电子邮件并收到C
的补丁。 同样,是否可以简单地应用该补丁,或者我是否需要更新补丁?
答案 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
)