是否可以与-ff-only更改进行部分合并?

时间:2014-06-22 07:13:26

标签: git git-merge

我有一个需要与远程合并的本地分支。远程和本地分支都有许多不同的提交(在各种文件上)。是否可以识别和合并仅具有快进类型(远程端)更改的文件?我想手动处理所有其他更改。当存在任何双面更改时,git merge --ff-only不会合并任何内容。

编辑:我想更清楚地提出问题。假设原始文件(在父节点上)是file1,file2,file3,file4。我的本地分支,我修改了file1,file2,删除了file4,添加了file5。在他们的远程分支中,他们修改了file1,file3,删除了file4,添加了file6。我想做以下事情:

  1. 使用更改者的信息识别所有更改(使用类似git diff的信息):file1(双方)file2,file5(我的身边)以及file3和file6。
  2. 仅合并特定的单方面更改(从他们这边):在我将本地与远程合并后,我应该在其远程分支中修改file3和file6,并在我的本地分支中修改file1,file2,file5。我将手动处理file1和file5与file6。

2 个答案:

答案 0 :(得分:2)

git read-tree是低级别合并准备,一切都没有实际的冲突解决方案。一个简单的方法是

  

git merge -s ours --no-commit other # no-op merge, just sets up parents
  git read-tree -um $( git merge-base HEAD other ) HEAD other
  # manual resolution here
  git commit

它会在两个分支中留下不同的新内容以进行手动解析,但会接受所有最多一个新版本的文件。您可能需要read-tree --aggressive选项来处理整个文件的删除和添加作为普通更改。

作为针对不太可能的案例的安全游戏,请检查git merge-base --all HEAD other 的输出。如果它显示多个基数(就像每个分支上的最新合并具有共同父项时那样),git' s(默认)"递归"合并策略会导出基本内容,产生比实际基数更好的自动分辨率结果,您可能需要特别注意手动分辨率。

答案 1 :(得分:0)

您可以声明类似于“Git - how to force merge conflict and manual merge on selected file”的合并驱动程序。

该驱动程序将使用git merge-file,除非您可以测试其退出值:

  

此程序的退出值在出错时为负数,否则为冲突数。

     

如果合并是干净的,则退出值为0.

因此,如果它返回0,您可以让合并继续(您的合并驱动程序以状态'0'退出)

在任何其他情况下,您将通过退出状态为“1”来强制进行手动合并。