git partial merge,而不是整个分支

时间:2010-11-30 16:23:11

标签: git merge

我已经阅读了Git: merging public and private branches while while keeping certain files intact in both branches和其他人合并的一些技巧,但未找到解决方案。

在我的情况下,我觉得需要采取相反的合并策略。在并行开发中,我必须在任意分支上保持一些文件相同。从另一方面来说,我不想做壁球或无提交合并,而差异很大,可能会破坏测试分支的当前状态。

我想要什么

git checkout testing

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

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

由于

4 个答案:

答案 0 :(得分:48)

你可以做几件事。

一,您可以樱桃选择您想要的更改,这仅适用于一次提交。例如,如果只有触及config.xml的更改,您可以使用

进行挑选
$ git cherry-pick $COMMIT_ID_YOU_WANT

你也可以从开发分支中获取config.xml

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

这将为您提供开发分支中存在的config.xml的相同版本,但请注意,它不会提取文件更改的历史记录。

答案 1 :(得分:19)

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

简而言之,如果您只想应用某些提交范围所做的更改(这也可能只是一次提交),只对一部分文件进行更改,那么:

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

答案 2 :(得分:5)

这是一个包含逐步文档的存储库,用于阐明部分合并的危险并以正确的方式显示。

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

TL; DR:

合并必须是它的本质:分支联盟。如果你在没有合并所有文件的情况下进行合并提交,并且稍后会尝试合并相同的分支,那么Git认为你合并了第一次合并提交中的所有内容,因此早期的提交无关紧要,它将跳过未合并的更改在第一次合并之前。

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

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

答案 3 :(得分:4)

可以合并直接从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>)