Reputation: 1747
In Linux, my favorite merge tool is Meld, and I've had no problems using or configuring it to work with Git. However, in Windows it has been a different story.
I configured my .gitconfig
like so to use Meld as the default mergetool
[merge]
tool = meld
[mergetool "meld"]
path = C:\\Program Files\\Meld\\Meld.exe
keepBackup = false
trustExitCode = false
So, when I have a conflict, I do git difftool
and Meld does in fact open. However, the paths to the files that Git writes to pass to the diff tool is incorrect. For example, even though Git generates the BASE, LOCAL, and REMOTE files in the repository directory (the location I called git mergetool
from), Meld tries to open each of those files in the directory of the executable.
Instead of opening C:\repo\roses.txt.LOCAL.2760.txt
, Meld tries to open C:\Program Files\Meld\roses.txt.LOCAL.2760.txt
.
Has anyone ran into this before, or know how to configure Git / Meld to work correctly on Windows?
Upvotes: 107
Views: 87311
Reputation: 52519
git difftool
in place of git diff
(see also the screenshots of meld below):
Download and install Git for Windows, which includes a "Git Bash" Linux-like terminal accessible via the right-click menu in any folder in Windows Explorer, once you've installed Git for Windows.
Download and install meld from here: https://meldmerge.org/.
Then, to make meld
your git difftool
, you can use these two commands, inside the Git for Windows bash terminal, (as Arugin says), using the proper path to Meld.exe. Note: for old versions of Windows, your path is likely "C:\Program Files (x86)\Meld\Meld.exe"
instead.
# For all OSs, run this first
git config --global merge.tool meld
# THEN:
# 1. For new versions of Windows
git config --global mergetool.meld.path "C:\Program Files\Meld\Meld.exe"
# 2. OR: For old versions of Windows
git config --global mergetool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
OR you can just edit your C:\Users\YOUR_USER_NAME\.gitconfig
file directly and add the following to the end of it (notice the mandatory usage of the double-backslashes [\\
] here as the path separator!). Note: again, for old versions of Windows, your path is likely C:\\Program Files (x86)\\Meld\\Meld.exe
instead:
[merge]
tool = meld
[mergetool "meld"]
path = C:\\Program Files\\Meld\\Meld.exe
Now call git difftool
in your Git for Windows bash terminal and Meld will open up as your default difftool viewer! If you don't already know: you can open said terminal in Windows by right-clicking in a folder in Windows Explorer and going to --> "Git Bash" or whatever it's called.
I might as well put the Linux instructions here too for my own reference in one place if nothing else:
For Linux it's even easier:
# 1. install meld
sudo apt update
sudo apt install meld
# 2. edit your ~/.gitconfig file (gedit GUI editor will open)
gedit ~/.gitconfig
Then add to the bottom of the .gitconfig file:
[diff]
tool = meld
That's it! git difftool
now works on Linux Ubuntu!
Install Meld on Mac OS: https://superuser.com/questions/360007/how-to-install-meld-with-homebrew-on-mac-osx/1177575#1177575.
(source)
meld
preferencesWhen done installing Meld: open Meld --> (on Windows) click the 3 horizontal lines (settings) in the top-right; (on Linux) click "Meld" at the top --> click "Preferences" --> "Editor" tab --> check the boxes for "Enable text wrapping" and "Show line numbers". See the screenshot below:
# 1. See changes you've made since your last commit (do this in place of
# `git diff`)
git difftool
# 2. Calling meld directly to compare two files:
meld path/to/file1.txt path/to/file2.txt
meld
NB: the below commands assume their branch is in your same code repo, since you are teammates. If this is not the case, you'll have to slightly modify the commands to check out from their forked repo instead of from your common repo. GitHub will show you the commands they recommend for checking out their branch when looking online at the PR.
git fetch origin someone_elses_branch
git checkout someone_elses_branch
git difftool main...HEAD # 3 dots, NOT 2!
# 1. Fetch their remote changes to your local machine into your
# locally-stored,remote-tracking hidden branch named
# `origin/someone_elses_branch`
git fetch origin someone_elses_branch
# 2. Check out this branch locally (this creates the locally-stored branch
# named `someone_elses_branch` from the locally-stored remote-tracking
# hidden branch named `origin/someone_elses_branch`)
git checkout someone_elses_branch
# 3. Do a difftool comparison (using meld now) to see the changes
# made on this branch from the point where they last checked out
# and forked off of `main`. This cmd (using 3 dots) is the equivalent of
# `git difftool $(git merge-base main HEAD) HEAD`.
git difftool main...HEAD # 3 dots, NOT 2!
meld
git blametool
] Is there git blame gui similar to bzr qannotate?Upvotes: 20
Reputation: 289
Schuess, be careful for space character in directories!
[merge]
tool = meld
[mergetool "meld"]
prompt = false
keepBackup = false
keepTemporaries = false
path = C:/Program Files (x86)/Meld/Meld.exe
cmd = \"/C/Program Files (x86)/Meld/Meld.exe\" \"$PWD/$LOCAL\" \"$PWD/$BASE\" \"$PWD/$REMOTE\" \"--output=$PWD/$MERGED\"
Upvotes: 28
Reputation: 321
For some reason, in Windows 10 the PATH environmental variable could not be set properly during the installation, so a strange exception is raised saying that it is not able to find some .dll that are under "C:\Program Files (x86)/Meld/bin" directory.
A workaround for me was, execute in git bash:
export PATH=$PATH:"/C/Program Files (x86)/Meld/lib"
Or add to windows PATH
C:\Program Files (x86)/Meld/bin
Upvotes: 4
Reputation: 2355
None of the answers worked for me. I ended up with this in the .gitconfig-file:
[merge]
tool = meld
[mergetool "meld"]
cmd = 'C:/Program Files (x86)/Meld/Meld.exe' $LOCAL $BASE $REMOTE --output=$MERGED
[mergetool]
prompt = false
After a git merge mybranch
ending with conflicts, you simply type git mergetool
and meld opens. After a save, you have to commit in git and the conflicts are resolved.
For some reason, this only worked with Meld 3.18.x, Meld 3.20.x gives me an error.
Upvotes: 2
Reputation: 130
After trying all of the above, setting Meld to run as administrator worked for me.
Run this program as an administrator
checkboxThe errors I received referenced temp files like c:\windows\temp\meld-*
, which were not being created. Elevating Meld's permissions seems to do the trick as it now works with both git difftool
and running manually within Meld.
Upvotes: 0
Reputation: 645
I too faced similar issue.Operating system used is Windows 10 and the following changes worked for me.It seems more like path issue
git config --global mergetool.meld.path "/c/Program Files (x86)/Meld/Meld.exe" <- path to meld here
Upvotes: 4
Reputation: 1947
Why do you not use git bash for Windows?
After install meld simply:
git config --global merge.tool meld
git config --global mergetool.meld.path "C:\Program Files (x86)\Meld\Meld.exe" <- path to meld here
Thats all!
Upvotes: 168
Reputation: 76
I found a solution in a bug report on the meld installer, on this page:
https://code.google.com/p/meld-installer/issues/detail?id=11
As far as I understand, the problem is that the meld.exe program (which runs meld through the python interpreter) needlessly sets the command's working directory to that of meld.exe. This causes relative paths to be interpreted incorrectly when passed as command line arguments.
The solution is to replace the provided meld.exe with one generated by compiling the meld.ahk file, using AHK2EXe (AutoHotKey script -> exe). Just download the script furthest down the page, as there have been a few version posted there.
Upvotes: 4
Reputation: 1059
I had the exact same problem and found I had to brute force my way to get it to work. Here is what I put in my .gitconfig file. (Note my meld executable is in a different location)
[merge]
tool = meld
[mergetool "meld"]
cmd = "/c/Meld/meld/meld.exe $PWD/$LOCAL $PWD/$BASE $PWD/$REMOTE --output=$PWD/$MERGED"
Upvotes: 10