我已经阅读了Git: merging public and private branches while while keeping certain files intact in both branches和其他人合并的一些技巧,但未找到解决方案。
在我的情况下,我觉得需要采取相反的合并策略。在并行开发中,我必须在任意分支上保持一些文件相同。从另一方面来说,我不想做壁球或无提交合并,而差异很大,可能会破坏测试分支的当前状态。
我想要什么
git checkout testing
git merge config.xml -b development
或git merge config\*.xml -b development
我想这就像git merge-files ...
命令,但第二个文件是从分支传递的,而不是从文件系统传递的。
可能吗?或者可能有一种解决方法?子模块?属性?
由于
答案 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>)