Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 合并文件时发生冲突错误,但文件现在显示冲突。更改将重命名和删除文件_Git_Github - Fatal编程技术网

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
    重命名为
    something.py
    ,并且他们也以相同的方式重命名了同一个文件,Git可以合并这些更改

  • 但是,如果双方都做出了冲突性的更改,比如我们将其命名为
    things.py
    ,而他们将其命名为
    something.py
    ,Git就不知道保留哪些更改和放弃哪些更改

无法将高级冲突记录为文件中的行更改,因此Git将其记录在其他地方:Git的索引中。1请记住,当Git进行新提交时,它使用的快照由索引中的文件副本组成,而不是工作树中的副本。2

在这种情况下,冲突是一方他们的,在这种情况下完全删除了一个文件,而另一方你的,在这种情况下修改了文件。Git不知道是保留您所做更改的文件,还是完全删除该文件。您必须选择正确的分辨率,这可能不仅仅是“保留”或“删除”:可能一些额外的文件也必须更改

例如,一些命令(如
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