简单的例子。这是'主人':
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能够做我想做的事情,还是只需要编写一个脚本?谢谢!
答案 0 :(得分:5)
这可以使用subtree
合并策略或subtree[=<path>]
合并策略的recursive
选项来完成。
来自git-merge
documentation,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
相反,如果您希望将更改合并到dist/
目录中,请检查dev
分支,然后运行:
git merge --no-ff -s recursive -X subtree=dist master
subtree
策略计算出如何“转移”树木。然后,您可以签出master
并快进到dev
分支上的新合并提交。