Git is an awesome tool for managing your code. However, it does take a while to get used to doing things in git. One question I get asked a bit too often is “how do I resolve binary merge conflicts”? Thankfully this is is pretty easy. I usually run the
git mergetool command to allow me to resolve merge conflicts using a graphical interface and then manipulate the resultant files on the command line.
You can specify which editor to use in your
~/.gitconfigfile. Favourites are kdiff3, vimdiff, xxdiff, and opendiff. If your on Mac OSX then you may be used to FileMerge, in which case you should be using opendiff in your
.gitconfig; see below.
tool = opendiff
So, when you are using mergetool option you will something like:
Normal merge conflict for 'lib/yui/assets/skins/sam/editor-sprite.gif':
Hit return to start merge resolution tool (opendiff):
I just hit return so the editor opens, it will probably warn you the file is binary. In a separate terminal window navigate to the directory where the file is in and do an
ls; you’ll see something like what is below:
In this case editor-sprite.gif.REMOTE.41930.gif is the new file and editor-sprite.gif is the original file. To resolve the conflict just copy the REMOTE file over the original file. In my case it would be
cp editor-sprite.gif.REMOTE.41930.gif editor-sprite.gif. However, I use the following one liner to resolve these conflicts more generically.
I have it in shell script in my path so I just run it when I need to resolve these types of conflicts. It just finds files with REMOTE in them and then issues a
cp command to copy that file over the original.
Hope this helps!
Outside of git mergetool you can just add the binary files using git add file1 file2 ….