Json 添加的文件上的Git奇怪合并冲突

Json 添加的文件上的Git奇怪合并冲突,json,git,Json,Git,我在git managed.json文件上遇到了一个奇怪的合并冲突,不知道这是怎么发生的 总结情况:我在我的分支a中添加了一个数据json文件a.json,我的同事在他的分支B中添加了一个类似格式的数据json文件B.json 在正常情况下,当我合并分支B时,应该只添加B.json。到目前为止运行良好-但是今天git显示了与我添加的a.json文件的合并冲突 我们已经检查过分支A没有文件B.json,分支B没有文件A.json 以下是这场冲突的截图: 我怀疑git重命名函数可能导致了这一点,但

我在git managed.json文件上遇到了一个奇怪的合并冲突,不知道这是怎么发生的

总结情况:我在我的分支a中添加了一个数据json文件a.json,我的同事在他的分支B中添加了一个类似格式的数据json文件B.json

在正常情况下,当我合并分支B时,应该只添加B.json。到目前为止运行良好-但是今天git显示了与我添加的a.json文件的合并冲突

我们已经检查过分支A没有文件B.json,分支B没有文件A.json

以下是这场冲突的截图:

我怀疑git重命名函数可能导致了这一点,但我不确定这一点

任何帮助都将不胜感激。谢谢

*编辑

我在两次提交(添加A.json时提交和添加B.json时提交)上运行了git diff,并确认git检测到添加的文件为重命名文件


但我仍然不知道为什么git检测到两个不同的文件添加作为重命名。也许我需要更多地了解git的重命名功能…

我也认为这是因为重命名了文件。您可以自己检查:

git log-p-3 | grep-i'重命名为:'
…其中
-3
限制要列出的提交数


Git根据文件的内容检测重命名。

我也认为这是因为重命名了文件。您可以自己检查:

git log-p-3 | grep-i'重命名为:'
…其中
-3
限制要列出的提交数


Git根据文件的内容检测重命名。

好的,所以这里发生了一个有点复杂的场景

首先,我找到了使用命令“重命名”的根本原因

git merge --Xno-renames [branch_B]
情景:

  • 我的同事添加了B.json,并将其合并到其他分支。我合并了另一个分支,因此在没有通知的情况下将B.json添加到我的分支中

  • 在我的分支中的自动数据清理过程中,B.json被删除

  • 我添加了一个.json似乎git认为此时B.json被重命名为A.json。

  • 之后,当我合并分支B时,B.json会与A.json产生冲突


  • 因此,与其说这是一个bug或git重命名问题,不如说这更像是我们的工作流缺陷…

    好吧,这里发生了一个有点复杂的场景

    首先,我找到了使用命令“重命名”的根本原因

    git merge --Xno-renames [branch_B]
    
    情景:

  • 我的同事添加了B.json,并将其合并到其他分支。我合并了另一个分支,因此在没有通知的情况下将B.json添加到我的分支中

  • 在我的分支中的自动数据清理过程中,B.json被删除

  • 我添加了一个.json似乎git认为此时B.json被重命名为A.json。

  • 之后,当我合并分支B时,B.json会与A.json产生冲突


  • 因此,这不是一个bug或git重命名问题,更像是我们的工作流缺陷…

    git的合并机制依赖于git的重命名检测机制

    Git提交存储每个文件的快照。没有额外的信息:只有这些文件。因此:

    • 如果有人在某个点添加了一些文件F,那么从缺少文件F的旧提交到包含文件F的新提交的差异包括以下指令:添加名为F的新文件,并包含给定的内容

    • 如果有人删除文件F并进行新的提交,则从旧提交到新提交的更改包括以下指令:删除名为F的文件

    • 如果有人将文件F1重命名为新名称F2,则旧提交和新提交之间的比较显示删除F1,并使用给定内容创建新F2。

    对于重命名情况,这是获得正确文件集的有效方法:接受旧提交,完全删除文件F1,并使用F1拥有的相同内容创建一个全新的F2。不过,这是一条很长的指令,人类倾向于反对它:我没有删除该文件,而是重命名了它!因此,
    git diff
    能够检查这种奇怪的情况:文件F1消失了,文件F2出现在它的位置。也许这些毕竟是同一个文件


    同时,
    git merge
    命令意味着:

    • 找到一些共同的祖先承诺,我们和他们(无论“他们”是谁)都从中开始
    • 将公共祖先中的快照与当前快照进行比较。无论发生了什么变化,这就是我/我们所做的工作:
      ours
      changes,确实如此
    • 将公共祖先中的快照与它们的快照进行比较,即我在
      git merge
      命令中告诉您的快照。不管发生什么变化,他们都是这么做的
    现在,假设在公共基提交中有一个名为
    B.json
    的文件。在您自己的提交中,有一个名为
    a.json
    的文件,但没有
    B.json
    文件。您是否删除了
    B.json
    ,并添加了一个完全不同的
    a.json
    ?或者,您是否将现有的
    B.json
    文件重命名为
    A.json
    ,并可能对其进行一些更改

    Git不知道,也不可能知道到底发生了什么事件,但是当Git找到一个重命名时,人们倾向于这样做,只要这两个文件“足够相似”。相似程度如何才能充分相似?Git有一种计算任意两个文件之间相似性索引的方法。diff或merge可以告诉您相似性索引是什么,您可以使用
    git diff
    自己查看相似性索引,使用
    git diff--find renames
    确保调用重命名检测器,并可以将其与某个阈值进行比较。默认阈值为50%:即使名称更改,至少50%相似的文件也是“同一文件”

    -X no renames
    标志完全关闭重命名检测。
    -X find renames=value
    标志