如何解决Git“CONFLICT(modify/delete)"?

ruarlubt  于 2023-08-01  发布在  Git
关注(0)|答案(5)|浏览(653)

我遇到了以前见过的Git合并冲突。

>git pull origin dev
From https://scm.starbucks.com/roastery-milan/choreographer
 * branch            dev        -> FETCH_HEAD
CONFLICT (modify/delete): <file name omitted> deleted in HEAD and modified in 01b734b9ae8594f03f5e481b123d80e41fb54d7c. Version 01b734b9ae8594f03f5e481b123d80e41fb54d7c of <file name omitted> left in tree.
...
Automatic merge failed; fix conflicts and then commit the result.

字符串
当我查看那些冲突的文件时,我没有看到任何冲突的迹象。我想我需要改变Git Head。但是,如何做到这一点?
顺便说一句,我们的GitHub最近有一些变化,有更多的分支用于分期。
更新:感谢大家的投入。现在我知道如何处理这个问题了。

1l5u6lss

1l5u6lss1#

该消息指出,您删除了当前分支中的一个文件,而其他人在您正在拉取的分支中修改了该文件。您需要决定如何处理该文件。
如果您要保留文件

$ git checkout <filename>
$ git add <filename>
$ git commit

字符串
如果要放弃该文件

$ git rm <filename>
$ git commit


如果文件已移动,则需要将更改复制到新位置。

nfzehxib

nfzehxib2#

看起来有一个文件,你已经在本地删除,但被远程修改:
冲突(修改/删除):在HEAD中删除,在01 b734 b 9ae 8594 f03 f5 e481 b123 d80 e41 fb 54 d 7 c中修改。
这是因为HEAD引用的是您的本地环境,而01b73是您正在合并的分支的尖端的SHA(通过pull)。
所以,Git不知道是删除文件还是保留它。
您应该首先验证是否要保留该文件。这将是暂存文件(如果您想保留它)(add)或删除文件(rm)。
最后,创建一个commit来解决冲突。

4bbkushb

4bbkushb3#

冲突的基本定义是,您接触了一些源代码行,而他们也接触了这些源代码行。例如,给定:

original line (in base): He said, "Hello world!"
your replacement:        He said, "Hello wonderful world!"
their replacement:       He said, "Goodbye cruel world!"

字符串
Git应该保留哪一行,应该丢弃哪一行,还是应该有第三个结果?Git 不知道,所以它把任务留给你。
在本例中,您的(“HEAD”)更改是通过删除整个文件来删除 * 每 * 行。他们的更改是修改文件的某些行。Git不知道该怎么做:它应该像你一样删除整个文件吗是否应该保留其修改版本?或者,也许还有第三种方法来解决这个问题。
一般来说,再次删除所有内容比重建它们的版本要容易(尽管这两种方式都不是很难),所以Git将它们的版本留在工作树中。如果这是正确的答案,你可以简单地git add这个文件来告诉Git:* 使用该版本 * 如果完全删除文件是正确的答案,那么git rm文件告诉Git:* 完全删除文件 。如果有第三个正确答案,根据需要编辑文件以放入正确的内容,然后git add文件以告诉Git: 使用该版本 *
无论如何,现在已经解决了这个特定文件的冲突(一旦您对适当的最终结果执行了git add-ed或git rm-ed)。如有必要,解决其他冲突,然后完成合并:

git commit


或者(自Git 2.12版本起):

git merge --continue

5f0d552i

5f0d552i4#

我相信这种情况会出现在合并树的一方删除了文件,而另一方修改了它。
解决办法是:
1)删除文件('git rm ...'),这会给予你一个不好听的消息,但在提交时会正确删除文件。
2)(我相信)添加文件('git add ...')然后提交它。
这取决于你决定你需要基于你想要的结果。

7kjnsjlb

7kjnsjlb5#

如果在合并两个分支时出现修改/删除冲突,这意味着

  • 在分支BRANCH_DELETED中,文件被删除。
  • 在分支BRANCH_MODIFIED中,文件被修改。

这里的大多数答案只是解释了这在技术上意味着什么,以及运行什么命令来保留或删除文件,甚至还有一个解释了一些底层的GIT实现细节。另一个解释了什么是一般的冲突,我认为这太宽泛了,不切实际。本文试图给予一个切实而完整的答案。
如果文件被删除,可能有多种原因:

  • 整个文件及其内容已过时,不再需要。
  • 文件已被移动或重命名。
  • 文件已移动到其他存储库。
  • 文件被拆分成多个文件(例如,在重构期间)。
  • 以上的任何组合。

这一点很重要,因为您需要找出文件的内容是否仍然存在于BRANCH_DELETED中的某个位置以及它们现在的位置,这样您就可以找出在BRANCH_MODIFIED中所做的更改是否仍然相关,如果是,它们需要去哪里。即使这些更改不能真正应用于仍然存在的任何内容,您也可能必须在某个地方进行一些具有相同或类似效果的其他更改。这可能需要理解你正在合并的代码及其历史,甚至可能需要与其他人交谈,所以你需要跳出GIT命令,GIT哈希和合并的框框(就像大多数冲突一样)。没有GIT命令可以为您执行此操作。
要做出明智的决定,您可能还需要查看在分支BRANCH_MODIFIED中所做的修改。您可以使用以下命令之一执行此操作:

git diff HEAD...<BRANCH_MODIFIED> -- <FILENAME>
git difftool HEAD...<BRANCH_MODIFIED> -- <FILENAME>

字符串
(See https://stackoverflow.com/a/44956845/2279059了解详情)
然后,您可以做出技术决定,是删除还是保留(已修改的)文件。您可以使用来自https://stackoverflow.com/a/48288738/2279059的命令或运行

git mergetool <FILENAME>


并在提示时选择保留修改的文件或删除它。如果你删除了它,也不用担心,你仍然可以看到上面描述的其他分支中的修改。
根据文件被删除的原因以及其内容发生了什么,您现在需要执行以下操作的一些组合.

  • 将修改(的一部分)应用于修改后的代码移动到的任何其他文件
  • 一些完全不同的东西,等同于BRANCH_MODIFIED中所做的修改,从而解决了冲突。
  • 以上任何一种,但在不同的存储库中
  • 什么都不需要(不再需要文件的内容和对它的任何修改)

很抱歉,这对很多人来说是显而易见的,但人们普遍误解冲突是一个技术问题,可以通过运行正确的GIT命令来解决,相信这一点和在StackOverflow上搜索解决方案之间可能存在相关性。

相关问题