tags:

views:

134

answers:

1

Is it possible to set Git up so that I can use the three-way compare in KDiff3?

I have two branches that are far too different to auto-merge them, I simply have to check each merge point and I think the best way would be to check out the branch I want the changes from the other branch and say

git difftool HEAD_OF_OTHER_BRANCH -- .

And then select Merge File in KDiff3. After having gone through the files I'd just commit.

I have set up merge.conflictstyle and diff.conflictstyle to diff3 but KDiff3 still starts with a two-way diff. Is this possible? I guess if Git also sends the common ancestor's hash as a parameter, this is possible, but does it?

There is discussion about how to do this with SVN and BC3, but I couldn't find anything for Git and KDiff3.

+1  A: 

It seems that git diff do only a 2-way diff (which make sense to generate patch etc) except in a merging state , you have to do a merge for that. I was in a similar situation the other day and I ended up mergin using the ours strategy. That worked but wasn't ideal. Maybe we need a 'nonresolve' merging strategy which doesn't try to resolve any conflicts. You might be able to emulate that by tweaking the .git/MERGE_* files and set all the files as conflicted.
Otherwise the obvious solution is to checkout 3 different directory and run kdiff3 , but I guess you are looking for a more elegant solution

mb14
Checking to different directories would be ok, except how do you create the third dir that holds the common ancestors? As long as I work on a single repo, Git figures the common ancestors out for me.
Makis
@makis you can use the 'git merge-base' command to find the common ancestor of two commits, handy.
mb14
Hm, so the common ancestor is the same for all files? I thought this could differ depending on when a file is edited. If it's the same for each file, then this would definitely be a workable solution.
Makis
git merge-base will give you the commit from where you fork. This commit is the same for every files indeed, but as long as you haven't cherry-picked any files between branches, that should be a good enough approximation.
mb14