git merge解决同名文件的冲突



如果文件具有相同的名称和相同的内容,我如何省略冲突?我只想处理不同的文件(相同的名称,不同的内容)。

我有一个修改的android内核。供应商最近发布了一个新内核版本的源代码。源代码以zip存档的形式发布。创建了一个repo:

unzip archive.zip && rm archive.zip
git init
git branch -M master
git add -A
git commit -m "Initial commit"

在我的主repo中我做了:

git remote add new /path/to/new/sources
git fetch new
git branch v2
git checkout v2
git merge --allow-unrelated-histories --no-commit new/master

尝试将新的内核版本合并到我的主repo中,但我得到了大约70k的合并冲突。用meld作为合并工具检查了其中的几个,它们根本没有区别。如果文件具有相同的名称和相同的内容,我如何省略冲突?我只想处理不同的文件(相同的名称,不同的内容)。

谢谢你的回复。

乌利希期刊指南27/09/2021

发现问题的根源。文件模式改变了很多。但我得到另一个麻烦- git只是忽略fileMode=false尝试了不同的方法:

git config --global core.fileMode false (that won't work cuz git clone and git init explicitly set fileMode to true, but why not)
git config core.fileMode false (in both repos folders)

在.git/config中尝试硬编码文件模式false .

也尝试直接将filemode=false传递给diff git,但它仍然没有忽略文件模式更改

$ git -c core.fileMode=false diff master new/master
diff --git a/Documentation/arm/Samsung/clksrc-change-registers.awk b/Documentation/arm/Samsung/clksrc-change-registers.awk
old mode 100644
new mode 100755
diff --git a/Documentation/features/list-arch.sh b/Documentation/features/list-arch.sh
old mode 100644
new mode 100755
...

还尝试传递core.filemode=false而不是core.fileMode=false以排除大小写敏感问题,但它仍然没有忽略文件模式更改…

git version: 2.33.0

操作系统:ArchLinux with 5.14.7-arch1-1 kernel

--allow-unrelated-histories标志是这里的罪魁祸首。这是错误的,尽管这可能是您能做的最好的事情,因为您可能没有必要的可用信息来做正确的事情(即,提供正确的历史记录)。

当你使用--allow-unrelated-histories时,你告诉Git:假装,作为合并的两个提交的合并基础,有一个完全空的提交,根本没有文件。这意味着两个历史记录中的每个文件都具有状态A,新添加了该文件的任何内容。

当添加两个具有相同内容的文件时,Git可以使用该文件的任何一个版本,因为内容是相同的。因此,对于每个在你的(仅)提交和他们在master(你的new/master)中最终提交的100%完全相同的文件,Git可以成功合并这些文件。

对于具有不同内容的文件-即使它只是一个空白行或一个空格- git将声明合并冲突。如果差异微不足道,明智的"双向合并";像meld1这样的程序可以自己合并它们。(这个合并结果是否正确完全是另一个问题:您需要检查或测试这些结果,无论在什么程度上都可以。但是对于所有合并都是如此。)

如果你不能产生正确的历史,即,找出你的源代码来自哪个Linux内核版本,并让你的提交在那个提交之后进行——这样Git就没有正确的合并基础,你可能不得不弄清楚如何在所有冲突的文件上运行meld,或者一些类似的工具,以减少冲突到那些可管理的。


1根据其广告,至少,meld将同时进行"双向合并"。(例如,通过猜测组合版本A和版本B)和标准的三向合并(查看一些基本版本,看看版本A和版本B中发生了什么更改,并组合更改而不仅仅是猜测)。以Git使用的三向合并的方式合并更改显然更优越,但即使这样,计算机程序仍然是在猜测,因为这些程序不理解输入文本的语义

任何时候有人说你们在争论"只是语义问题",你可以这样回答:"好吧,我们将果冻三明治这个概念。"让我们brumblefrotz !"如果他们听不懂你说的话:"谁在乎呢?"这只是语义问题!"由于语义字面上意味着"意义","纯粹语义";意味着他们不关心意义。见https://people.howstuffworks.com/semantics.htm。是的,我是个迂腐的人,有时还有点爱发牢骚。😀)

我不认为你必须从一个空的回购开始。实际上,您可以在已有的repo上工作,而不需要新的repo。找出压缩内核是从哪个版本开始的(我认为这可以从内核中的配置文件中获取)。然后,在你能找到的项目中最接近的东西上创建一个分支。说内核是基于5.1.4的(在这里编数字…不管是什么)。然后将该标签用于新分支(选择正确的标签,不记得它们是如何写的,我在使用手机):

git checkout -b other-kernel v5.1.4 # use the right tag
git rm -r * # remove EVERYTHING. Is -r necessary?
unzip the-other-kernel.zip
rm the-other-kernel.zip
git add . # add everything back
git commit -m "the other kernel"
理论上,这应该只添加应用于其他内核的实际更改。现在可以去一个新的地方合并....了它应该给你更少的冲突。

最新更新