Git 合并文件时发生冲突错误,但文件现在显示冲突。更改将重命名和删除文件
当我试图用主节点更新分支时,我遇到了这个错误Git 合并文件时发生冲突错误,但文件现在显示冲突。更改将重命名和删除文件,git,github,Git,Github,当我试图用主节点更新分支时,我遇到了这个错误 C:\Users\santosh\Documents\GitHub\zakta\backEnd\nlue-service>git merge emailTest CONFLICT (modify/delete): backEnd/nlue-service/nlue_service.py deleted in emailTest and modified in HEAD. Version HEAD of backEnd/nlue-service/
C:\Users\santosh\Documents\GitHub\zakta\backEnd\nlue-service>git merge emailTest
CONFLICT (modify/delete): backEnd/nlue-service/nlue_service.py deleted in emailTest and modified in HEAD. Version HEAD of backEnd/nlue-service/nlue_service.py left in tree.
Automatic merge failed; fix conflicts and then commit the result.
通常在这种情况下,我可以打开文件,并指出冲突,我可以修复这些冲突。这一次,问题是文件名的更改和删除。因此,当我打开这些文件时,我无法进行任何更改 您在分支中更改的文件似乎已在
emailTest
中删除。如果您使用git mergetool
,您应该有机会保留该文件(进行更改),或者删除该文件(如emailTest
中的情况)
存在不同类型的合并冲突。你在这里提到的是:
通常。。。我可以打开文件,并指出冲突
我称之为低级冲突,因为它们是由Git的llmerge.c
code生成的,其中ll
代表“低级”。低级冲突意味着某个文件的某些部分有两个冲突的更改:我们的更改和他们的更改。在本例中,文件的工作树副本显示这两个版本的行。如果使用Git的merge.conflictStyle
设置选择冲突的diff3
样式,则它们将包括第三个合并基版本
我们必须将这一点与另一种冲突——高级别冲突——进行对比:
- 当文件中非源代码行的内容发生更改时,会发生高级更改。例如,它的名称可能会更改:也许,在合并基提交中,某个文件名为
,但现在,在thing.py
--我们的
或
中,它被重命名为--他们的
something.py
- 如果差异的一方,比如base和ours,进行了高层名称更改,而另一方(base和他们的)没有更改任何内容,Git将接受这一更改
- 如果双方做出相同的改变,情况也是如此。如果我们将
重命名为thing.py
,并且他们也以相同的方式重命名了同一个文件,Git可以合并这些更改something.py
- 但是,如果双方都做出了冲突性的更改,比如我们将其命名为
,而他们将其命名为things.py
,Git就不知道保留哪些更改和放弃哪些更改something.py
git mergetool
)将为您提供完全删除文件(其更改)或将其与更改(您的更改)一起保留的机会。如果这两个动作中有一个是正确的,那就好了。否则,作为完成Git合并的人,您的工作就是采取任何正确的操作,并将其记录在Git的索引中
Git的索引保存将进入下一次提交的所有文件的副本。您在工作树中看到的文件副本可供您使用。对这些文件执行任意操作,然后使用git add
和/或git rm
更新每个文件的索引副本。运行git add
或git rm
将冲突标记为已解决
1 Git保存此信息的方式有一点缺陷。不过,在本例中,您将拥有文件的两个索引副本,而不是其中的三个,如果没有其他高级冲突,就足以知道发生了什么 2从技术上讲,索引保存引用而不是副本,但效果几乎相同
更多关于索引的信息 Git的索引(Git也称之为暂存区)有点复杂。它有不止一个角色。在大多数情况下,它的主要作用是,它是您构建下一次提交的地方 通常,当您不合并时,您会:
git checkout somebranch # or git switch somebranch, in Git 2.23 or later
然后在工作树中工作,对更新的文件运行git add
,然后运行git commit
。您没有看到的部分是初始的git签出
在git的索引中创建了最近提交的somebranch
的整个文件集。然后将这些文件复制到您的工作树中,以便您可以查看和编辑它们。3
git add所做的是将您编辑的工作树文件复制回索引中,替换索引中以前的副本。这就是为什么每次编辑文件时都必须git添加文件的原因:这不是因为索引中没有该文件,而是因为索引中的副本现在已过期,您必须替换它
请注意,git status
在git add
之前没有将文件列为staged
。在git add
之后,它确实将文件列为staged
。这并不意味着文件以前不存在,现在也存在。这意味着之前存在的副本与提交中的副本匹配。现在,在git add之后,索引中的副本与提交中的副本不再匹配
换句话说,每个文件始终有三份副本:
HEAD index work-tree
-------------------- ------------------- -------------------
README.md README.md README.md
.../nlue_service.py .../nlue_service.py .../nlue_service.py
最初,所有三个副本都匹配。然后你改变一个工作树一个,现在HEAD
和索引匹配,bu
HEAD index work-tree
-------------------- ------------------- -------------------
README.md README.md README.md
.../nlue_service.py .../nlue_service.py .../nlue_service.py
Version HEAD of backEnd/nlue-service/nlue_service.py left in tree.
git add backEnd/nlue-service/nlue_service.py
git show :1:backEnd/nlue-service/nlue_service.py