尽管文件不存在,Git合并冲突仍然存在。

14

你能帮助我理解这个行为吗:

在develop分支上,我有一个文件,其中包含两个提交:

BOCZA2@PC45819 MINGW64 /c/nttcloud/gitlab/coba/ZAA (develop)
$ git log --oneline -- coba.zaa.model/coba.zaa.model.config/src/main/java/com/zaa/model/config/Channel.java                      
8509cdf Added route generator based on freemarker template
1e890b7 Added XML configuration for test objects in StaticDataInitializer

然后我可以切换到我的功能分支:

BOCZA2@PC45819 MINGW64 /c/nttcloud/gitlab/coba/ZAA (develop)
$ git checkout feature/ZAA_tools_xmlgenerator
Switched to branch 'feature/ZAA_tools_xmlgenerator'
Your branch is up-to-date with 'origin/feature/ZAA_tools_xmlgenerator'.

同时检查一下我是否对该文件提交过更改:

BOCZA2@PC45819 MINGW64 /c/nttcloud/gitlab/coba/ZAA (feature/ZAA_tools_xmlgenerator)
$ git log --oneline -- coba.zaa.model/coba.zaa.model.config/src/main/java/com/zaa/model/config/Channel.java

该文件在当前工作目录中也不存在:

BOCZA2@PC45819 MINGW64 /c/nttcloud/gitlab/coba/ZAA (feature/ZAA_tools_xmlgenerator)
$ cat  coba.zaa.model/coba.zaa.model.config/src/main/java/com/zaa/model/config/Channel.java
cat: coba.zaa.model/coba.zaa.model.config/src/main/java/com/zaa/model/config/Channel.java: No such file or directory

但是,当我尝试将develop分支合并到我的功能分支时:

BOCZA2@PC45819 MINGW64 /c/nttcloud/gitlab/coba/ZAA (feature/ZAA_tools_xmlgenerator)
$ git merge develop
[...]
Auto-merging         coba.zaa.model/coba.zaa.model.config/src/main/java/com/zaa/model/config/Channel.java
CONFLICT (content): Merge conflict in coba.zaa.model/coba.zaa.model.config/src/main/java/com/zaa/model/config/Channel.java
[...]
Automatic merge failed; fix conflicts and then commit the result.

我遇到了合并冲突(两个文件都被修改)。

BOCZA2@PC45819 MINGW64 /c/nttcloud/gitlab/coba/ZAA (feature/ZAA_tools_xmlgenerator|MERGING)
$ git status -s coba.zaa.model/coba.zaa.model.config/src/main/java/com/zaa/model/config/Channel.java
UU coba.zaa.model/coba.zaa.model.config/src/main/java/com/zaa/model/config/Channel.java

问题是什么?该文件在特性分支中不存在!合并冲突的原因是什么?我的代码库有问题吗?我如何找出原因?


你的 git merge develop 之后立即运行 git diff 命令,文件冲突提示了什么? - Kent Shikama
8个回答

9
在我的情况中,由于git中的文件重命名是一种运行时启发式方法,我遇到了相同的问题。(这就是Michael Monteith的回答所提出的问题,但没有解决方案。)在合并时,git决定我分支中不存在的文件实际上是我分支上存在具有相似内容的文件的重命名。默认情况下,在单个提交中具有50%相似性的任何文件都会被视为合并期间的重命名。要求git以更高的阈值进行合并即可解决问题: git merge {branch} -X rename-threshold=100% 至于为什么我会遇到这个问题:因为我们团队决定采用单个压缩提交策略来处理pull-requests。这意味着主分支上的单个提交非常巨大,从而使得这些单个大提交内部的“重命名”(即不同路径上类似的文件)的机会倍增。

这并没有解决我的问题。对于我已经删除的文件,我只是将其添加为暂存文件并提交合并。 - user08

6
我通过运行git reset解决了这个问题。

3
请在评论中说明为什么投票反对,这样我可以改进我的答案。我尝试了解决方案,在我的环境中运行良好,并希望分享。没有提及原因而进行投票会产生“泄气”的效果。 - Pawan
这并没有解决我的问题。对于我已经删除的文件,我只是将其添加为暂存文件并提交合并。 - user08

4

在重命名文件并尝试rebase后,我遇到了类似的问题。我收到了以下消息:

"com.mycompany.fileThatDoesNotExist.java需要合并。您必须编辑所有合并冲突,然后使用git add标记它们为已解决".

通过使用以下命令删除文件,我解决了这个问题:

"git rm com.mycompany.fileThatDoesNotExist.java"

然后继续rebase过程,问题得到解决。

git rm com.mycompany.fileThatDoesNotExist.java

也适用于我,尽管git会抛出一个错误,指出路径与任何现有文件都不匹配。 - jhp

3

可能是你的特性分支中修改的文件在develop分支中被重命名了?

我曾经遇到这样一个问题:主分支将一个文件(比如A.java)重命名为B.java,而特性分支修改的却是A.java文件。
当我进行合并时,出现了B.java的合并冲突,尽管特性分支从未有过B.java这个文件。


0

我发现每当我们更改css和js编译器/压缩器代码/引擎等内容时,就会出现这种情况。通常只需创建它说有冲突但实际上不存在的文件即可减轻问题。这样可以提交其他文件...但是有问题的文件仍未提交。然后您可以在单独的提交中提交这些文件,然后删除它们并再次提交,这样就可以解决所有问题了。这是一个愚蠢而疯狂的修复方法,但每次都有效。

如果您难以确定冲突文件,我强烈建议使用以下方法。

首先使用此命令创建一个干净的别名

git config --global alias.conflicts "diff --name-only --diff-filter=U"

然后您可以运行

git conflicts

以轻松获取具有问题的文件列表。


0
在我的情况下(使用IntelliJ IDEA),他在事件日志中提到的一个文件出现了问题。由于这个文件在两个分支上都不存在,我创建了一个空文件,使用冲突的名称进行提交,然后就可以再次合并了。
我也通过git diff看到了这个文件。

0

当我在开发分支上对特性分支进行变基时,遇到了类似的问题。出现了文件不存在的错误,不能使用git rmgit add命令。

我通过创建缺失的文件、继续变基,然后再次删除该文件来解决了这个问题。


0

首先你可以检查一下。

// List git-ignored files  
$ git ls-files . --ignored --exclude-standard --others

// List untracked files  
$ git ls-files . --exclude-standard --others

你可以试试。

1) "" git add . "" needs u to be in the correct directory, so you can try "" git add -A "" to add everything.  
AND  
2) git clean -f

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接