<t>To follow-up on Charles Bailey's answer, here's my git setup that's using p4merge (free cross-platform 3way merge tool); tested on msys Git (Windows) install:<br/>
<br/>
git config --global merge.tool p4merge<br/>
git config --global mergetool.p4merge.cmd 'p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"'<br/>
<br/>
```<br/>
<br/>
or, from a windows cmd.exe shell, the second line becomes :<br/>
<br/>
```<br/>
git config --global mergetool.p4merge.cmd "p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""<br/>
<br/>
```<br/>
<br/>
The changes (relative to Charles Bailey):<br/>
<br/>
- added to global git config, i.e. valid for all git projects not just the current one<br/>
<br/>
- the custom tool config value resides in "mergetool.[tool].cmd", not "merge.[tool].cmd" (silly me, spent an hour troubleshooting why git kept complaining about non-existing tool)<br/>
<br/>
- added double quotes for all file names so that files with spaces can still be found by the merge tool (I tested this in msys Git from Powershell)<br/>
<br/>
- note that by default Perforce will add its installation dir to PATH, thus no need to specify full path to p4merge in the command<br/>
<br/>
Download: [http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools](http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools)<br/>
<br/>
**EDIT** (Feb 2014)<br/>
<br/>
As pointed out by [@Gregory Pakosz](https://stackoverflow.com/users/216063/gregory-pakosz), latest [msys git](http://msysgit.github.io/) now "natively" supports **p4merge** (tested on *1.8.5.2.msysgit.0*).<br/>
<br/>
You can display list of supported tools by running:<br/>
<br/>
```<br/>
git mergetool --tool-help<br/>
<br/>
```<br/>
<br/>
You should see *p4merge* in either *available* or *valid* list. If not, please update your git.<br/>
<br/>
If *p4merge* was listed as *available*, it is in your *PATH* and you only have to set *merge.tool*:<br/>
<br/>
```<br/>
git config --global merge.tool p4merge<br/>
<br/>
```<br/>
<br/>
If it was listed as *valid*, you have to define *mergetool.p4merge.path* in addition to *merge.tool*:<br/>
<br/>
`<br/>
<br/>
*(Réponse tronquée)*</t>