git合并:未触及的文件中的冲突

git合并:未触及的文件中的冲突,git,linux-kernel,Git,Linux Kernel,我将尝试通过以下示例来说明我的问题: 我有一个linux内核git存储库,其中包含2.6.31-6版本,并做了一些修改。我想把它和2.6.32合并。但在git拉取过程中,我在我从未接触过的文件中看到了许多必须手动解决的冲突 怎么了?我的意思是,git有完整的提交历史,它有一个关于在父提交后修改的文件和未修改的文件的信息。为什么它不能将最后一次修改应用于未触及的文件 更新1:@DanAloni和@KevinBallard解释了为什么在将-rc与较新的稳定版本合并时会出现冲突 但有没有办法减少手动冲

我将尝试通过以下示例来说明我的问题:

我有一个linux内核git存储库,其中包含2.6.31-6版本,并做了一些修改。我想把它和2.6.32合并。但在git拉取过程中,我在我从未接触过的文件中看到了许多必须手动解决的冲突

怎么了?我的意思是,git有完整的提交历史,它有一个关于在父提交后修改的文件和未修改的文件的信息。为什么它不能将最后一次修改应用于未触及的文件

更新1:@DanAloni和@KevinBallard解释了为什么在将-rc与较新的稳定版本合并时会出现冲突

但有没有办法减少手动冲突的数量,特别是在-rc与release合并的情况下


更新2:感谢@DanAloni的解释

您确定您描述为2.6.31-6的版本在2.6.32的历史记录中吗?据我所知,关于Linux内核版本控制,2.6.31-6听起来像是2.6.31加上“稳定的分支补丁”。这肯定会与从2.6.31版本到2.6.32稳定树的历史发生冲突。因此,我认为您正在尝试将2.6.31的稳定或修补分支与2.6.32的稳定树合并。这肯定不是git所说的“快进”,我当然认为会有冲突。

你确定你所描述的2.6.31-6版本在2.6.32的历史中吗?据我所知,关于Linux内核版本控制,2.6.31-6听起来像是2.6.31加上“稳定的分支补丁”。这肯定会与从2.6.31版本到2.6.32稳定树的历史发生冲突。因此,我认为您正在尝试将2.6.31的稳定或修补分支与2.6.32的稳定树合并。这肯定不是git所说的“快进”,我当然希望会有冲突。

是的,它应该出现在历史上,因为有一个标记对应于2.6.31-rc6:git标记-l | grep 2.6.31-rc6@DanKruchinin:这并不意味着它已经出现在2.6.32的历史中。如果你说git log 2.6.32..2.6.31-rc6,假设2.6.32和2.6.31-rc6是标记的名称,那么它会打印任何东西吗?如果是的话,就意味着2.6.31-6不是2.6.32的祖先,丹·阿洛尼很可能是正确的。@KevinBallard谢谢,这是有道理的。有没有什么便宜的方法可以将-rcN与更高的稳定版本合并?标签的存在并不能说明您要合并到的分支的历史。git tag-l只打印数据库中的所有标记,而不考虑任何分支的历史记录。有一个git命令可以告诉我当前分支的历史记录中包含了哪些标记,但我想不起来。实现这一点的“廉价方法”是应用一个补丁,恢复2.6.31和2.6.31-6之间的所有更改,然后尝试合并2.6.32。请注意,您可能会在该恢复上遇到冲突。假设当前分支表示2.6.31-6,那么为该恢复生成差异就在git diff HEAD..v2.6.31的行中。您可以使用另一个git命令git apply将该差异作为提交应用。是的,它应该出现在历史记录中,因为有一个标记对应于2.6.31-rc6:git tag-l | grep 2.6.31-rc6@DanKruchinin:这并不意味着它已经出现在2.6.32的历史中。如果你说git log 2.6.32..2.6.31-rc6,假设2.6.32和2.6.31-rc6是标记的名称,那么它会打印任何东西吗?如果是的话,就意味着2.6.31-6不是2.6.32的祖先,丹·阿洛尼很可能是正确的。@KevinBallard谢谢,这是有道理的。有没有什么便宜的方法可以将-rcN与更高的稳定版本合并?标签的存在并不能说明您要合并到的分支的历史。git tag-l只打印数据库中的所有标记,而不考虑任何分支的历史记录。有一个git命令可以告诉我当前分支的历史记录中包含了哪些标记,但我想不起来。实现这一点的“廉价方法”是应用一个补丁,恢复2.6.31和2.6.31-6之间的所有更改,然后尝试合并2.6.32。请注意,您可能会在该恢复上遇到冲突。假设当前分支表示2.6.31-6,那么为该恢复生成差异就在git diff HEAD..v2.6.31的行中。您可以使用另一个git命令git apply将该差异作为提交应用。