Git: How can I configure KDiff3 as a merge tool and diff tool?

218,352

Solution 1

These sites were very helpful, almost, mergetool and difftool. I used the global configuration, but can be used by repository without problems. You just need to execute the following commands:

git config --global merge.tool kdiff3
git config --global mergetool.kdiff3.path "C:/Program Files/KDiff3/bin/kdiff3.exe"
git config --global mergetool.kdiff3.trustExitCode false

git config --global diff.guitool kdiff3
git config --global difftool.kdiff3.path "C:/Program Files/KDiff3/bin/kdiff3.exe"
git config --global difftool.kdiff3.trustExitCode false

Note that the latest version kdiff3 moved the executable from the root of the application folder C:/Program Files/KDiff3 into the bin/ folder inside the application folder. If you're using an older version, remove "bin/" from the paths above.

The use of the trustExitCode option depends on what you want to do when diff tool returns. From documentation:

git-difftool invokes a diff tool individually on each file. Errors reported by the diff tool are ignored by default. Use --trust-exit-code to make git-difftool exit when an invoked diff tool returns a non-zero exit code.

Solution 2

Just to extend the @Joseph's answer:

After applying these commands your global .gitconfig file will have the following lines (to speed up the process you can just copy them in the file):

[merge]
    tool = kdiff3
[mergetool "kdiff3"]
    path = C:/Program Files/KDiff3/kdiff3.exe
    trustExitCode = false
[diff]
    guitool = kdiff3
[difftool "kdiff3"]
    path = C:/Program Files/KDiff3/kdiff3.exe
    trustExitCode = false

Solution 3

For Mac users

Here is @Joseph's accepted answer, but with the default Mac install path location of kdiff3

(Note that you can copy and paste this and run it in one go)

git config --global --add merge.tool kdiff3 
git config --global --add mergetool.kdiff3.path  "/Applications/kdiff3.app/Contents/MacOS/kdiff3" 
git config --global --add mergetool.kdiff3.trustExitCode false

git config --global --add diff.guitool kdiff3
git config --global --add difftool.kdiff3.path "/Applications/kdiff3.app/Contents/MacOS/kdiff3"
git config --global --add difftool.kdiff3.trustExitCode false

Solution 4

Well, the problem is that Git can't find KDiff3 in the %PATH%.

In a typical Unix installation all executables reside in several well-known locations (/bin/, /usr/bin/, /usr/local/bin/, etc.), and one can invoke a program by simply typing its name in a shell processor (e.g. cmd.exe :) ).

In Microsoft Windows, programs are usually installed in dedicated paths so you can't simply type kdiff3 in a cmd session and get KDiff3 running.

The hard solution: you should tell Git where to find KDiff3 by specifying the full path to kdiff3.exe. Unfortunately, Git doesn't like spaces in the path specification in its config, so the last time I needed this, I ended up with those ancient "C:\Progra~1...\kdiff3.exe" as if it was late 1990s :)

The simple solution: Edit your computer settings and include the directory with kdiff3.exe in %PATH%. Then test if you can invoke it from cmd.exe by its name and then run Git.

Solution 5

Update 2021:

With Git 2.33 (Q3 2021), on Windows, mergetool has been taught to find kdiff3.exe just like it finds winmerge.exe.

git config --global merge.tool kdiff3 is enough.

See commit 47eb4c6 (07 Jun 2021) by Michael Schindler (michaelcompressconsult).
(Merged by Junio C Hamano -- gitster -- in commit b7bd70d, 08 Jul 2021)

mergetools/kdiff3: make kdiff3 work on Windows too

Signed-off-by: Michael Schindler [email protected]

The native kdiff3 mergetool is not found by git mergetool(man) on Windows.
The message "The merge tool kdiff3 is not available as 'kdiff3'" is displayed.

Just like we translate the name of the binary and look for it on the search path for WinMerge, do the same for kdiff3 to find it.


2018:

To amend kris' answer, starting with Git 2.20 (Q4 2018), the proper command for git mergetool will be

git config --global merge.guitool kdiff3 

That is because "git mergetool" learned to take the "--[no-]gui" option, just like "git difftool" does.

See commit c217b93, commit 57ba181, commit 063f2bd (24 Oct 2018) by Denton Liu (Denton-L).
(Merged by Junio C Hamano -- gitster -- in commit 87c15d1, 30 Oct 2018)

mergetool: accept -g/--[no-]gui as arguments

In line with how difftool accepts a -g/--[no-]gui option, make mergetool accept the same option in order to use the merge.guitool variable to find the default mergetool instead of merge.tool.

Share:
218,352

Related videos on Youtube

Jose Rodriguez
Author by

Jose Rodriguez

Passionate about technologies, good code, difficult problems and good solutions. Blog: Runtime Corner

Updated on March 06, 2022

Comments

  • Jose Rodriguez
    Jose Rodriguez over 2 years

    Recently I was using GitExtension 2.46, but the Git version that has the same is 1.9.4.msysgit.2. Willing to use only Git commands, I uninstalled GitExtension and install the latest version available of Git and KDiff3.

    When I make a merge and have conflicts, I run the following command:

    git mergetool
    

    Then I receive the message:

    The merge tool kdiff3 is not available as 'kdiff3'.

    I guess it must be by the KDiff3 path.

    Environment

    • OS: Windows 10
    • Git 2.6.1.windows.1
    • KDiff3 0.9.98 (64 bit)

    Questions:

    • What do I have to configure in the .gitconfig file for the command git mergetool to open the KDiff3 GUI with the versions LOCAL, REMOTE, BASE and MERGED of conflicted file?

    • How can I configure it to use it as a diff tool?

  • David Torres
    David Torres over 7 years
    Still, why would I want git-difftool not to exit if kdiff3 fails?
  • Guillaume Raymond
    Guillaume Raymond about 7 years
    For me to have the diff tool recognized by Visual Studio 2015, I had to change this line git config --global --add diff.guitool kdiff3 to this : git config --global --add diff.tool kdiff3
  • Igor Kustov
    Igor Kustov about 7 years
    @Alex78191, my answer reflects the Joseph's answer and there you can find more details about this setting.
  • Matthew Flaschen
    Matthew Flaschen almost 7 years
    @DavidTorres Probably because badly behaved Windows tools (that exit with non-zero codes on success) ruin it for everyone.
  • matt wilkie
    matt wilkie over 6 years
    According to the referenced docs setting trustExitCode to false is unnecessary, since the default is to ignore it anyway.
  • matt wilkie
    matt wilkie over 6 years
    It took me a long time to get this right. 2 things led me astray: (1) The .gitconfig file I was editing was not the one being used. See stackoverflow.com/questions/2114111/… for identifying the one(s) being loaded. (2) Don't mix and match cmd = and path = in gitconfig, TL;DR: delete cmd and just use path
  • Vivek
    Vivek over 6 years
    Now on git bash use .... git difftool <filename> or simple git difftool to run the diff gui kdiff3 you just set.
  • Thomas Weller
    Thomas Weller over 6 years
    AFAIK, --add will add a second or third entry when invoked multiple times. That's hard to fix later, because it can't simply be removed with --remove. Just setting a value without --add should be ok.
  • Thomas Weller
    Thomas Weller about 5 years
    Don't use --add since that may result in 2 config entries if you run the command twice. It's a mess cleaning this up, because you can't delete a single entry any more. See git-scm.com/docs/git-config: "Multiple lines can be added to an option"
  • Jose Rodriguez
    Jose Rodriguez over 4 years
    Good point @ThomasWeller, the answer was updated to reflect your suggestion
  • trustory
    trustory about 4 years
    Is there a way to default to KDiff3 when typing 'git diff'?
  • jjstcool
    jjstcool about 3 years
    Lol, I gave up on this one, but you made it work withing seconds. Big Thank You
  • Volodymyr Kotylo
    Volodymyr Kotylo almost 3 years
    for visual studio also add this:[diff] tool = kdiff3