如何仅合并现有文件

时间:2018-06-18 15:07:32

标签: git merge atlassian-sourcetree

我有一个包含30个文件的存储库A,并将第二个存储库B添加为remote。此存储库有120个文件,但repo A中的30个文件也包含在此处。

如何将B合并到A但仅合并现有的(30)文件?

我尝试从Repo B合并整个分支,但后来我修改了30个文件,另外90个作为新文件。

我使用Sourcetree客户端,也许这是一个针对此案例的功能。

1 个答案:

答案 0 :(得分:1)

听起来这些repos有一些共同的历史,或者你已经确定了如何处理它,以便你的30个文件正确合并 - 所以你只需要保持其他90个文件不被添加到目标分支......

这里有一个警告[1],但有一种方法可以做到:

git checkout repo_a_branch
git merge --no-commit repo_b_branch

暂定合并结果现在暂存但尚未提交,因此您可以对其进行修改。如果90个文件很容易通过路径或glob来识别,以区别于30个文件,那么

git rm path-or-glob-of-unwanted-files

然后commit

如果这些文件混乱的方式会使这种情况变得困难,你可以做这样的事情

git status --porcelain |grep ^A |cut -d ' ' -f3 |xargs git rm -f

删除不需要的文件后,您可以commit完成合并。

[1]如果你有

     x -- x -- x <--(repo_b_branch)
...
     x -- x -- x <--(repo_a_branch)

你找到了一些创建

的解决方案
        x -- x -- x <--(repo_b_branch)
...                \
     x -- x -- x -- M <--(repo_a_branch)

其中M仍然只有30个文件,然后M似乎正在删除 90个“其他”文件。因此,如果您将来尝试从repo_a_branch合并到repo_b,那么您将处理那些从合并中取出的文件。

更一般地说,你在这里所拥有的有时被称为“邪恶合并”,因为它“隐藏”相对于默认合并结果的变化。特别是在默认合并成功完成的情况下,如果您运行某些假定默认合并的命令,这可能会导致麻烦。

这适用于上述解决方案,也适用于生成此提交图的任何其他解决方案,同时仅保留repo a中的30个文件。