Git 部分合并,而不是整个分支

我在 Git: 合并公共和私有分支,同时在两个分支中保持某些文件完整和其他文章中读到过一些关于合并的技巧,但是没有找到解决方案。

在我的情况下,我觉得需要做相反的合并策略。在并行开发中,我必须在任意分支上保持一些文件相同。从另一方面,我不想做压缩或不提交合并,而差异是显着的,可以打破当前状态的测试分支。

我想要什么

git checkout testing

git merge config.xml -b developmentgit merge config\*.xml -b development

我猜想这类似于 git merge-files ...命令,但是第二个文件是从分支传递的,而不是从文件系统传递的。 有可能吗? 或者可能有一种解决方案? 子模块? 属性?

谢谢

59638 次浏览

有几件事你可以做。

第一,您可以对 选择进行所需的更改,这只应用一次提交。例如,如果有一个只涉及 config.xml的更改,您可以使用

$ git cherry-pick $COMMIT_ID_YOU_WANT

你也可以从开发部门抓取 config.xml:

$ git checkout testing
$ git checkout development -- config.xml

这将得到与开发分支中相同的 config.xml版本,但是请注意,它不会提取文件更改的历史记录。

基本上你们都可以在这里读到: http://www.gelato.unsw.edu.au/archives/git/0701/37964.html

简而言之,如果你只是想应用由一定范围的提交所做的更改(这也可以只是一个单一的提交) ,只对文件的一个子集进行更改,那么这样做:

git diff commit1..commit2 filepattern | git apply --index && git commit

可以根据直接从 git-tree 中挑选的文件进行合并。
我的建议是:
$git ls-tree development —— config.xml
$git show < blob-hash > > config.xml.development

然后得到共同的基础:

$git ls-tree $(git merge-base HEAD development)—— config.xml
$git show < blob-hash > > config.xml.base

最后:

$ git merge-file config.xml config.xml.base config.xml.development

不过我没测试过。

使用 zsh 这样的 shell,您可以避免将 blob 保存到一个临时文件中:

$ git merge-file config.xml =(git show <base-blob-hash>) =(git show <dev-blob-hash>)

下面是一个存储库,它提供了一个逐步的文档,以澄清部分合并的危险性,并展示正确的方法。

Https://gitlab.com/bimlas/learning-by-testing-git-partial-merge/tree/doc

译者:

合并必须是这样的: 分支的联合。如果你在进行合并提交时没有合并所有的文件,并且你将在以后尝试合并相同的分支,那么 Git 会认为你在第一次合并提交时已经合并了所有的文件,因此早先的提交并不重要,它会在第一次合并之前跳过未合并的更改。

使用 checkout将文件从一个分支复制到另一个分支:

git checkout BRANCH -- FILE
git commit -m "Partial merge"