如何在git中合并子目录?
是否有可能只合并一个子目录的变化从本地git分支到远程git分支,还是“全部或全部”?
例如,我有:
branch-a - content-1 - dir-1 - content-2
和
branch-b - content-1 - dir-1 - `content-2
我只想合并branch-a dir-1的内容和branch-b dir-1的内容。
就像SO问题“ 如何合并select性文件和git-merge? ”一样,我刚刚发现这个GitHub线程可以更适合合并整个子目录,基于git读取树 :
我的资料库=>
cookbooks
我的资料库目标目录=>cookbooks/cassandra
远程资源库=>
infochimps
远程存储库源我想合并到cookbooks/cassandra
=>infochimps/cookbooks/cassandra
这是我用来合并它们的命令
- 添加存储库并获取它
git remote add -f infochimps git://github.com/infochimps/cluster_chef.git
- 执行合并
git merge -s我们的--no-commit infochimps / master
- 只将
infochimps/cookbooks/cassandra
合并到cassandra
git read-tree --prefix = cassandra / -u infochimps / master:cookbooks / cassandra
- 提交更改
git commit -m'在infochimps cassandra中合并'
附录
这是奇怪的, [编辑] – 但read-tree
步骤可能会失败,如下所示:
error: Entry 'infochimps/cookbooks/cassandra/README' overlaps with 'cookbooks/cassandra/README'. Cannot bind.
即使两个文件都是相同的 这可能有助于:
git rm -r cassandra git read-tree --prefix=cassandra/ -u infochimps/master:cookbooks/cassandra
但是,当然,手动validation这是做你想做的。
对于我的例子,假设你有一个分支“源”和一个分支“目的地”,它们都反映了自己的上游版本(或不是,如果只在本地),并拉到最新的代码。 比方说,我希望repo中的子目录叫做newFeature,它只存在于“source”分支中。
git checkout destination git checkout source newFeature/ git commit -am "Merged the new feature from source to destination branch." git pull --rebase git push
大大减less了我见过的所有事情,这对我来说是完美的, 在这里find 。
请注意,这不是一个“真正的合并”,因此您不会在目标分支中提供有关newFeature的提交信息,只需修改该子目录中的文件即可。 但是因为你可能想把整个分支合并到一起,或者放弃它,这可能不是问题。
我从Eclipse的论坛主题中得到了这个,它像一个魅力:
git checkout source-branch git checkout target-branch <directories-or-files-you-do-**NOT**-want> git commit git checkout target-branch git merge source-branch
创buildgit repo包含分支-a和分支-b
git checkout branch-a git diff branch-b dir-1 > a.diff patch -R -p1 < a.diff