应用git 补丁时出现冲突是否正常?
Is it normal to have conflicts during applying a git patch?
我有两个存储库,比方说 main repo
和 copy 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
标志,并且您必须手动编辑补丁结果。
我有两个存储库,比方说 main repo
和 copy 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
标志,并且您必须手动编辑补丁结果。