如何将文件从一个分支的目录合并到另一个分支?

时间:2015-04-16 21:55:48

标签: git git-merge branching-and-merging git-checkout

简单的例子。这是'主人':

root
    - index.html
    - readme.md

这是一个名为'dev'的分支:

root
    src
        - index.jade
    dist
        - index.html

我想将index.html文件(或所有文件,真的)放在'dev'分支的'dist'文件夹中,并将其替换或合并到我的master分支的根目录中。我试过,从主人那里:

git checkout dev dist/

但它产生了这个结果:

root
    dist
        - index.html
    - index.html

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

1 个答案:

答案 0 :(得分:5)

这可以使用subtree合并策略或subtree[=<path>]合并策略的recursive选项来完成。

来自git-merge documentationsubtree策略的说明:

  

<强> subtree

     

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

subtree[=<path>]合并策略的recursive选项说明:

  

<强> subtree[=<path>]

     

此选项是子树策略的更高级形式,其中策略会猜测在合并时必须如何移动两棵树以匹配彼此。相反,指定的路径是前缀(或从头开始剥离),以使两棵树的形状匹配。

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

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

相反,如果您希望将更改合并到dist/目录中,请检查dev分支,然后运行:

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

subtree策略计算出如何“转移”树木。然后,您可以签出master并快进到dev分支上的新合并提交。