如何在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