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

use*_*997 8 git git-merge git-checkout branching-and-merging

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

root
    - index.html
    - readme.md
Run Code Online (Sandbox Code Playgroud)

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

root
    src
        - index.jade
    dist
        - index.html
Run Code Online (Sandbox Code Playgroud)

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

git checkout dev dist/
Run Code Online (Sandbox Code Playgroud)

但它会产生这样的结果:

root
    dist
        - index.html
    - index.html
Run Code Online (Sandbox Code Playgroud)

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

fra*_*ale 6

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

git-merge文档中,对subtree策略的描述:

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
Run Code Online (Sandbox Code Playgroud)

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

git merge --no-ff -s recursive -X subtree=dist master
Run Code Online (Sandbox Code Playgroud)

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