git partial merge,而不是整个分支

ole*_*nko 55 git merge

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

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

我想要什么样的东西

git checkout testing

git merge config.xml -b development 要么 git merge config\*.xml -b development

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

谢谢

mip*_*adi 49

你可以做几件事.

一,您可以挑选您想要的更改,这仅适用于一次提交.例如,如果只有触摸的变化config.xml,你可以选择它

$ git cherry-pick $COMMIT_ID_YOU_WANT
Run Code Online (Sandbox Code Playgroud)

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

$ git checkout testing
$ git checkout development -- config.xml
Run Code Online (Sandbox Code Playgroud)

config.xml将使您获得与开发分支中存在的版本相同的版本,但请注意,它不会引入文件更改的历史记录.

  • 对于第二个解决方案:如果测试分支将合并到开发分支,是否会导致合并冲突?我有一种情况,我希望将更改从一个功能分支带到另一个功能分支,我不太确定这是一个好主意,因为当两个分支合并回主服务器时,它可能会导致严重的冲突破坏. .. (7认同)

lum*_*idu 19

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

简而言之,如果您只想应用由特定提交范围所做的更改(这也可以只是一次提交),只对一部分文件进行更改,则执行以下操作:

git diff commit1..commit2 filepattern | git apply --index && git commit
Run Code Online (Sandbox Code Playgroud)


bim*_*las 6

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

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"
Run Code Online (Sandbox Code Playgroud)

  • @RaffiKhatchadourian 它用于将 Git 命令和参数与文件列表分开。见 /sf/answers/932504401/ (2认同)

小智 5

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