如何将一个分支目录下的文件合并到另一个分支中?涉及IT技术。

8

一个简单的例子。这是“主”:

root
    - index.html
    - readme.md

这是一个名为“dev”的分支:
root
    src
        - index.jade
    dist
        - index.html

我希望能够取得“dev”分支下“dist”文件夹中的index.html文件(或所有文件),并将其替换或合并到我的主分支根目录中。我已经尝试从主分支执行此操作:

git checkout dev dist/

但是它会产生以下结果:
root
    dist
        - index.html
    - index.html

显然这不是我想要的。git能够做到我想要的吗,还是我只能编写一个脚本?谢谢!


请您能否以与展示不期望的结果相同的方式展示所需的合并后存储库结构呢? - frasertweedale
1个回答

6
使用 subtree 合并策略或 recursive 合并策略的 subtree[=<path>] 选项可以完成此操作。
git-merge 文档 可以了解到,subtree 策略的描述如下:

subtree

这是一种修改过的递归策略。当合并树 A 和 B 时,如果 B 对应于 A 的子树,则首先调整 B 以匹配 A 的树结构,而不是在相同级别上读取树。这个调整也会应用到共同祖先树。

subtree[=<path>] 选项的描述如下,它是对 recursive 合并策略的扩展:

subtree[=<path>]

这个选项是 subtree 策略的高级形式,当合并时,策略会猜测两个树应该如何移动才能匹配。相反,指定的路径将被添加前缀(或从开头剥离),以使两个树的形状匹配。

在您的情况下,如果 master 是当前分支,则以下命令将把来自 dev 分支的 dist/ 目录内容合并到根目录中(如果有冲突,您将有机会解决):

git merge --no-ff -s recursive -X subtree=dist dev

如果您希望将更改合并到dist/目录中,请切换到dev分支,然后运行:
git merge --no-ff -s recursive -X subtree=dist master

“子树”策略可以确定如何“移动”树。然后,您可以切换到“主”分支并快进到“dev”分支上的新合并提交。

尝试了您的命令,但是我得到了相同的结果(整个“dist”目录被添加到主分支中,而不仅仅是它的内容)。 - user41997
你是把 dev 分支合并到 master 分支(即合并提交的第一个父级分支),而不是反过来吗? 如果是这样的话,仓库是否已经发布在某个地方以便查看这个情况呢? - frasertweedale
是的,我从 master 运行了该命令。这是一个测试仓库:https://github.com/eggbit/test - user41997
好的,那个测试仓库是从 master 分支快进到 dev 分支的;现在尝试使用 --no-ff 参数(正在更新答案)。 - frasertweedale
好的,很高兴你解决了它 :) - frasertweedale
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接