Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.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,我有一个分支a,有一个名为foo的文件夹。另一个名为B的分支只有文件夹foo的内容。是否可以将分支B合并到分支A的文件夹foo 例如,分支A包含 foo/ hello_world.c goo/ AliceAndTom.c 分支B仅包含文件夹foo的内容/ ./ hello_world.c hello_world.h 合并分支B后我希望在分支A中得到的结果: foo/ hello_world.c hello_world.h goo/ Al

我有一个分支a,有一个名为
foo
的文件夹。另一个名为B的分支只有文件夹
foo
的内容。是否可以将分支B合并到分支A的文件夹
foo

例如,分支A包含

foo/
    hello_world.c
goo/
    AliceAndTom.c
分支B仅包含文件夹foo的内容/

./
    hello_world.c
    hello_world.h
合并分支B后我希望在分支A中得到的结果:

foo/
    hello_world.c
    hello_world.h
goo/
    AliceAndTom.c
编辑
分支B是使用git命令创建的
git filter branch--subdir目录filter/to/filter--subdir\u branch

您不能直接将其合并到中

关于git的重命名检测在这里是否有帮助,评论中有些混乱。根据您所说的分支是如何创建的(使用
过滤器分支
),它很可能不会。这是因为新分支可能与旧分支没有共同的祖先。[1]

因此,首先您必须解决让git识别来自分支的相应文件的问题;然后,您必须解决一个问题,即它仍然不知道该文件的两个当前状态的最新共同祖先,因此合并不会顺利进行。(两个分支上存在的每个文件很可能会在整个文件上发生冲突,而不是真正合并任何内容。)

这是“不同分支上有不同内容”可能产生的问题之一;这并不是git的工作方式,它可以使跨分支的更改集成变得非常单调乏味

这将有多乏味取决于自运行
过滤器分支以来每个分支上的文件更改了多少。我能想到的最普遍的程序是:

(1) 编写一个脚本,将文件移回其子目录

(2) 在较新的分支上运行
filter branch
(将上述脚本作为树过滤器),创建另一个结构更接近原始分支的分支

(3) 标识新分支中与原始分支中的提交相对应的最后一次提交

(4) 使用
git replace
替换上面标识的提交,以代替原始分支中相应的提交

(5) 现在,您应该能够将新分支合并到原始分支。然后您可以撤消git replace
,并可能处理新分支

每个步骤都有需要了解的细节;这不是一个简单的过程,因此,如果您想继续执行,请参阅相关命令的文档


[1] -更具体地说,为了应用重命名检测,git必须查看一个补丁,该补丁既删除了一个文件,又创建了另一个具有足够相似内容的文件(位于不同路径)

如果您从
master
分支,然后在分支上进行了一次提交,并在其中移动了文件,那么您现在将看到类似这样的情况

x -- x -- O -- A <--(master)
           \
            x -- x -- B <--(bramch)

默认情况下,合并将失败(没有公共历史记录),如果您使其不失败(通过说允许不相关的历史记录),则它将充当一个带有空
树的合并基(即没有文件)。从该路径到
A
的修补程序创建
foo/file
,从该路径到
B
的修补程序创建
file
,但两个修补程序都不会同时删除一个路径上的文件并创建另一个路径上的文件,因此不会发生重命名检测。合并将创建文件的第二个副本。

您应该能够。Git在尝试确定文件重命名时执行了一项可接受(并非完美、可接受)的任务。但是文件.h可能会在base dir中结束,而不是在foo中。。。。但是,如果运行
git merge--on commit
,则可以在完成合并之前移动它。将文件移动到所需的位置,然后
git merge--继续
。首先移动其中一个分支中的文件夹,然后合并。Git不会为您移动文件。Git合并的行为不像您想象的那样。您建议的合并结果可能包含两个
hello\u world.c
文件,一个在
foo/
文件夹中,另一个在根级别。@TimBiegeleisen我看到git解决了重命名问题,并相应地应用了更改。我知道它并非完美无瑕,但值得一试,看看会发生什么。最坏的情况是:
git merge--abort
@eftshift0你是对的,我没有想到这一点。Git可以“找出”它是同一个文件。
x -- x -- x -- A <--(master)

x -- x -- B <--(branch)