【问题标题】:How do I merge only existing files如何仅合并现有文件
【发布时间】:2018-06-18 15:07:31
【问题描述】:

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

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

我尝试合并来自 Repo B 的整个分支,但后来我修改了 30 个文件,其他 90 个文件作为新文件。

我使用Sourcetree 客户端,可能有适合这种情况的功能。

【问题讨论】:

    标签: git merge atlassian-sourcetree


    【解决方案1】:

    听起来这些存储库有一些共同的历史,或者您已经确定了如何处理它,以便您的 30 个文件正确合并 - 因此您只需要阻止其他 90 个文件被添加到目标分支...

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

    git checkout repo_a_branch
    git merge --no-commit repo_b_branch
    

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

    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,您将处理那些从合并中取出的文件。

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

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

    【讨论】:

      猜你喜欢
      • 2013-10-03
      • 2011-03-07
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 2016-06-29
      • 2017-06-24
      • 2013-07-07
      • 1970-01-01
      相关资源
      最近更新 更多