2014-06-22 56 views
2

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

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

  1. 确定与谁进行了更改(具有类似git的差异)的信息,所有的变化:文件1(双方)文件2,file5(我身边)和文件3和file6上他们的身边。
  2. 合并只有特定的片面变化(从他们的侧面):我合并我的本地与远程后,我应该在远程分支中修改file3和file6,并在我的本地分支中修改file1,file2,file5。我将手动处理file1和file5与file6。
+0

请问你能协调“我合并后[]我应该[]文件1,文件2,文件5修改我的本地分支”上面的[我想只有其他方面更改不是我](http:// stackoverflow。 “是否可以做一个部分合并与ff-only-changes/24357649?noredirect = 1#comment37665629_24357649)”? – jthill

+0

我的不好。我最初想过要求两种不同的合并方式,一种是上面提到的方法,另一种是所有远程更改都被接受的情况下,所有本地更改都被恢复。对不起,我身边的困惑。所以,你的回答对前面的第2项是好的。你对第1项有什么想法吗? – Armut

回答

2

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

git merge-s ours --no-commitother# no-op merge, just sets up parents
git read-tree -um $(git merge-baseHEADother) HEADother
#manual resolution here
git commit

它将两个分支中的所有内容都保留为手动分辨率,但接受所有最新版本的文件。您可能需要read-tree--aggressive选项,以处理整个文件的删除和添加为普通更改。

对于一个不太可能的情况下安全打法,检查git merge-base--all HEADother输出。如果它显示了多个基地(就像每个分支上最近的合并具有共同的父母时那样),git的(默认)“递归”合并策略将派生基础内容,产生比实际基地更好的自动解决结果,而且你可能想要使用您的手动解决方案时要格外小心。

+0

感谢您阅读“树状结构”提示。你可以让我知道你为什么使用我们的,并澄清'other'和$(git merge-base HEAD other)HEAD other'。我也更新了这个问题,使其更加清晰。 – Armut

+0

'other'只是其他分支名称。作为一个好处,你能更具体地说明什么会给你带来' - 我们的'和'读取树'参数的困难吗?我宁愿回答具体的问题,而不是盲目地解释整个手册页。 – jthill

+0

'$(git merge-base HEAD other)'指的是父母,或者让我们说两个分支发源的原始地方.'HEAD'我的本地分支。 '其他'远程分支。这是正确的解释吗?我不明白你为什么在合并时使用''我们的'',我只想要其他方面的变化不是我的。 – Armut

0

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

那司机会用git merge-file,除了可以测试它的退出值:

这一计划的退出值是错误负,冲突的数量,否则。

如果合并是干净的,出口值为0

所以,如果它返回0,就可以让合并继续(您的合并驱动程序状态退出“0”)

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

相关问题