To get it working on any linux flavor is pretty straight forward. Run these commands from terminal:
git config --global diff.tool bc git config --global difftool.prompt false git config --global difftool.bc trustExitCode true git config --global merge.tool bc git config --global mergetool.bc trustExitCode true
In order to get directory diffs working (e.g.
git difftool --dir-diff), I had to tweak the settings a little bit. By default, git uses symlinks to do the directory diff and BC4 will not follow those by default yielding something that looks like this:
There are a couple of ways to fix this (courtesy of StackOverflow). The approach I like is updating Beyond Compare to follow the symlinks.
In the Folder Compare, click the Rules toolbar button (referee icon). Go to the Handling tab. Check Follow symbolic links. To make this affect all new sessions, change the dropdown at the bottom of the dialog from Use for this view only to Also update session defaults before you click OK.
On Windows, in addition to the above commands, you need to tell git the path to
git config --global difftool.bc.path "c:/program files/beyond compare 4/bcomp.exe" git config --global mergetool.bc.path "c:/program files/beyond compare 4/bcomp.exe"
You don’t need to do anything special to get directory diffs working on Windows.
Visual Studio includes a builtin diff viewer that is pretty nice. However, I don’t find it as useful as I do Beyond Compare. Not to mention, it doesn’t support 3-way merge. Instead of using your global git config, it forces you to change the git config file in the repo. Specifically, you need to open
git/config in the repo and add the following:
[diff] tool = bc4 [difftool "bc4"] cmd = \"C:\\Program Files\\Beyond Compare 4\\BComp.exe\" \"$LOCAL\" \"$REMOTE\" [merge] tool = bc4 [mergetool "bc4"] cmd = \"C:\\Program Files\\Beyond Compare 4\\BComp.exe\" \"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\"
Now, among other things, you can right-click files in VS and choose Compare with Unmodified to open Beyond Compare.
Pretty much the only difference from above is using
bc3 instead of
git config --global diff.tool bc3 git config --global difftool.prompt false git config --global difftool.bc3 trustExitCode true git config --global merge.tool bc3 git config --global mergetool.bc3 trustExitCode true
On Windows, it is a little more work. In addition to the above, you need to tell git the path to
git config --global difftool.bc3.path "c:/program files (x86)/beyond compare 3/BCompare.exe" git config --global mergetool.bc3.path "c:/program files (x86)/beyond compare 3/bcomp.exe"
The reason I am using
BCompare.exe for the difftool instead of
bcomp.exe is described here. When using the new
--dir-diff option of the
git difftool command:
git difftool 4e560^^ --dir-diff #4e560 is your commit hash that you want to show a whole directory-diff on in BC
Beyond Compare 3 has a bug that is not fixed as of v3.3.12 where you need to employ this workaround. If you don’t do it,
bcomp.exe will exit too early, and no files will be available to diff while you are viewing the directory diff.
This is fixed in BC4, so you should probably just upgrade to that.
Once you have it setup, you can easily run
git difftool path/to/my/file.js
in your working copy to show unstaged changes. If you want to see a diff of the whole directory, you can run:
git difftool --dir-diff
which opens BC’s directory comparison which can’t be beat IMO.
To resolve merge conflicts:
That will cycle through each merge conflict in the working copy and as long as you save the file from BC, the conflict will be marked resolved by git (hence the
mergetool.bc trustExitCode setting).