应用git 补丁时出现冲突是否正常?

Is it normal to have conflicts during applying a git patch?

我有两个存储库,比方说 main repocopy repo,它们必须使用补丁进行同步。他们的 master 分支已同步,我在 copy repo 上应用 main repo-dev 分支的补丁。在创建补丁并将其应用于 copy repo 后,我将 dev 分支合并到 main repo 上的 master 以保持它们同步。

我在 main repo 上使用以下方法创建了补丁文件:

git format-patch origin/master..origin/develop --stdout > ../patches/patch-001.patch

当我尝试在 copy repo 上应用此补丁时使用:

git am -3 --ignore-space-change patch-001.patch 

我得到 Patch failed at 0002 ... 并且我必须解决补丁文件中几乎每个提交的冲突。

问题是打补丁的时候正常有冲突吗?我以前也这样做过,但是没有出现过这样的问题。

解决如此多的冲突(大约 50 次提交)是一个非常困难和令人困惑的过程。我正在使用 PyCharm 本身来解决每个补丁失败的冲突,但仍然很难。有没有更简单的方法来做到这一点?

为什么会发生这些冲突?是因为我在这些提交之间有 merges 吗?

既不“正常”也不“异常”。就是这样。如果您的白猫的耳尖长有缓慢生长的皮肤癌,可以通过简单的手术轻松切除。浅肤色猫耳朵上的皮肤癌“正常”吗? ab正常,如果你的猫出门:黑色素含量低的皮肤细胞上的紫外线会导致突变,有时会导致基底细胞癌。您可以将您的猫留在室内(无论如何,通常建议大多数家猫这样做),但这并不能保证他 不会 粉红色耳尖或鼻子上的皮肤癌。1

Why [do] these conflicts happen?

当Git 进行合并时,Git 找到三个 个输入文件。当您应用补丁时,如果补丁中有 index: 行,Git 可能会选择进行合并。2 index 行告诉Git 原始文件 是什么,补丁适用于哪个文件。 Git 然后可以将补丁(此时仅适用于原始文件)应用到 原始文件以得出“他们的文件”。

Git 现在具有用于任何合并的相同信息:原始文件、具有 您的 更改的文件版本,以及 他们的 版本的文件有 他们的 更改。 Git 现在可以将您的更改与他们的更改进行比较,看看它们是否重叠。

如果他们改变的是独立改变的,Git 将能够组合这些更改。例如,假设他们修正了第 10 行 speeling 一词的拼写,而你没有。相反,假设您通过在文件顶部添加 40 行版权声明来修复缺少版权声明的问题。 Git 将能够看到 speeling 行现在是第 50 行,而不是第 10 行,并且应该应用他们的修复。 Git 将应用他们的修复,一切都会好起来的。

但是如果你修复了speeling和同一行的其他一些词,Git 不知道是采用你的修复还是他们的修复。所以 Git 现在抱怨这一行的合并冲突。那是因为您的更改会影响其更改所影响的基础文件的相同行。 Git不知道用哪个。

这正常吗?如果你们都更改了相同文件的相同行。这完全取决于“你”更改了哪些行,以及“他们”更改了哪些行,基于你们从[=66]开始的文件的通用起始版本 =].如果您在此过程中从其他人那里获得了这些更改,则不会:只要 他们 没有 在版本中进行这些更改他们开始,所以“你的”更改(包括其他人的更改)和他们的更改重叠,你会得到冲突。

请注意,即使您的更改和他们的更改不完全重叠,您也会遇到冲突。例如,如果他们更改第 5 到 8 行,而您更改第 9 行,则这些更改“触及边缘”(“邻接”,使用花哨的词)并且 Git 将调用 也是一个冲突。


1我住在犹他州时,我养了一只纯黑色的小猫,鼻子上得了某种癌症。因此,即使有大量黑色素也不能保证不会出现这种情况,尽管它有帮助。不过,她的生活还算过得去,堪称“老猫”。她姐姐去年死于肾衰竭,所以即使她通过了癌症切除手术,她也可能活不了多久。不幸的是,鼻子手术比耳尖修剪要大得多。

2如果补丁缺少索引行,Git不能 进行三向合并。但这仅意味着不应用 失败 的补丁,而不是尝试合并;您将需要 --reject 标志,并且您必须手动编辑补丁结果。