Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.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 - Fatal编程技术网

在两个分支中移动文件时,Git合并失败

在两个分支中移动文件时,Git合并失败,git,Git,我正在执行一个git合并,在合并的两个分支中以相同的方式移动了许多文件。令我惊讶的是,git在我合并的分支中找不到大约10个文件的版本 i、 文件从/path/file.txt开始。在分支1中,文件被修改,然后移动到/path/newpath/file.txt。在分支2中,文件被移动到相同的路径/path/newpath/file.txt。当我合并时,我希望git能够处理这个问题。但是,它将此显示为合并冲突,表示文件已从分支1中删除。我有三个问题: 为什么git找不到这些文件?我天真地希望git

我正在执行一个git合并,在合并的两个分支中以相同的方式移动了许多文件。令我惊讶的是,git在我合并的分支中找不到大约10个文件的版本

i、 文件从/path/file.txt开始。在分支1中,文件被修改,然后移动到/path/newpath/file.txt。在分支2中,文件被移动到相同的路径/path/newpath/file.txt。当我合并时,我希望git能够处理这个问题。但是,它将此显示为合并冲突,表示文件已从分支1中删除。我有三个问题:

  • 为什么git找不到这些文件?我天真地希望git简单地说“在合并分支中获取此文件路径的版本”,但它可能没有这样做?在我看来,所涉及的文件发生了很大的变化,这让我怀疑git正在比较文件内容,以确定它们是否是合并候选文件,正如这个问题所建议的: 但是,具有相同路径和名称的文件肯定应该被视为合并候选文件,即使它们的内容发生了相当大的变化
  • 是否有一些配置可以更改,告诉Git考虑与合并候选具有相同名称和路径的文件?我提到的问题建议您可以设置文件相似性百分比,但这似乎是实现我想要的目标的一种间接方式
  • 我可以通过手动或脚本更新我的git索引来实现这种合并,以告诉git另一个分支中文件的对象哈希。根据另一个SO问题的脚本,它看起来像这样:

    FILE_PATH=“PATH/to/FILE.txt”


    git update index--index info索引保存您想要提交的内容,因此索引中的路径应该是合并提交中的路径。但是,这里有多条路径,因此请参见下面对#3的回答

    按顺序回答您的问题:

  • “当然,具有相同路径和名称的文件应被视为合并候选文件”:不一定,因为存在重命名检测

    Git通过标识合并基(实际提交,或者在某些罕见的情况下使用“递归合并”技巧,通过执行另一次合并而进行的虚拟提交)开始合并过程,然后将合并基与整个树区分开来,使之与所讨论的两次提交相对应(
    HEAD
    ,运行
    git merge
    时的提交/分支,以及
    merge\u HEAD
    ,请求合并的提交)。这会产生两个单独的差异,每个差异都有各自的重命名检测

    在这种特殊情况下,在两个分支中,
    path_a
    被重命名为
    path_b
    ,但实际上只检测到一个重命名。(如果两个重命名均未检测到,则会出现“创建/创建冲突”git认为,
    path\u b
    是在两个分支中独立创建的。如果检测到两个相同的重命名,git只会“从基础中的
    path\u a
    合并到
    HEAD
    merge\u HEAD
    中的
    path\u b
    。因此我们可以得出结论,git在这里只成功了一半。)

    由于git没有注意到两个diff中的一个中的
    path\u b
    实际上是从
    path\u a
    重命名的,它决定在该diff中,您只需删除
    path\u a
    并编写一个完全不同的
    path\u b
    。它无法合并任何更改,因为
    HEAD
    中的
    path\u b
    无关>路径b
    合并头中

    您链接到的索引更新问题显示了如何告诉git,不,事实上,在这两种情况下,
    path_b
    s都是相关的,合并基础版本只是命名为
    path_a
    。然后,最终的“git checkout-m”创建适当的合并版本(可能存在合并冲突)

  • -X rename threshold
    选项是目前唯一的选项。按照您链接到的问题中的链接,脚本可以“事后”告诉git它错过的任何重命名

  • 这是我必须做一点实验的地方。索引项确实告诉git共同祖先的SHA-1,这在“索引槽1”中。从某种意义上说,它所走的路径完全无关:要进行合并,git只需要文件内容(对于所有三个版本:base aka stage 1、HEAD aka stage 2和MERGE_HEAD aka stage 3)。基于索引格式和脚本(),这里需要的路径可能不是原始路径,而是新提交的路径,但我不确定

  • 。正如您所说,两个分支都更改了文件内容。您可能无法避免冲突。