如何合并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问题“如何将选择性文件与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 ours --no-commit infochimps/master
    
  • 只将infochimps/cookbooks/cassandra合并到cassandra
  • git read-tree --prefix=cassandra/ -u infochimps/master:cookbooks/cassandra
    
  • 提交更改
  •  git commit -m 'merging in 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
    

    但是,当然,手动验证这是做你想做的。


    对于我的例子,假设你有一个分支'源'和一个分支'目的地',它们都反映了它们自己的上游版本(或者不是,如果仅在本地),并且被拉到最新的代码。 比方说,我希望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
    

    大大减少了我见过的所有事情,这对我来说非常合适,在这里找到。

    请注意,这不是“真正的合并”,因此您不会在目标分支中拥有有关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
    
    链接地址: http://www.djcxy.com/p/45037.html

    上一篇: How do I merge a sub directory in git?

    下一篇: How to fix merge conflicts for a lot of files in git?