Invariably when working on files, you'll edit a file, and wonder how it differs from what you've previously committed, or staged to commit with a "git add." You can discover these differences with the "git diff" command.
"git diff" shows the difference between what's in your working directory, what your currently working on, and what's in your index staged to be committed next, or is already committed. It will look at the same files in each place and show you the differences in the files. To test this out change a file that you already have committed and then run "git diff."
When more than one developer is working on a project a three way difference may occur between the two developers working on a file, and the previously committed version of a file. These conflicts arise when you try to merge two branches together with a "git merge," or a recent "git pull" from another repository may produce a merge conflict.
The problem with both diff and merge is sometimes there are multiple differences in the files, and changes can be extensive. Its difficult to rectify any conflicts from the command line, besides a Window GUI is nicer for this type of conflict resolution. The diff/merge is typically done in an editor specifically designed to show files side by side with changes highlighted.
Git has two commands that will launch the diff/merge editor full screen from the command line, "git difftool" and "git mergetool." Which ever file comparison editor you use, it needs to be configured in Git so the "git difftool" and "git mergetool" command will bring up the editor with the correct files loaded.
There is one caveat, in order to run "git difftool' or "git mergetool" you have to first run "git diff" or "git merge" and have a difference or conflict. The editor will then launch with the correct files ready for editing.
Two questions come to mind. Which tool should I use? How do I configure it to run when you type "git difftool" or "git mergetool" in git?
There are several valid Git merge tools listed in the Git documentation: kdiff3, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, diffuse, tortoisemerge, opendiff, P4merge and Araxis.
I've looked at every tool in the above list, and some others, and only two tools stand out above the rest: SourceGear's Diffmerge, and Perforce's P4Merge. I started using Diffmerge in Git at first, its a nice tool, but it has bars along the side showing changes, not lines going across. When I went to edit a file with multiple problems, I went nuts trying to work with their bars running down the screen, which leaves P4Merge. I go through a selection process with my criteria for selecting a good file comparison tool in my article: "Perforce's P4Merge File Comparison Editor - a Review." Since I'm now using P4Merge, let's go through setting it up to be used with Git.
P4Merge is free, download it here . You want to download the Helix P4: Visual Merge Tool, and the installation script will ask you what components you want to install. You have to check you do not want to install any of the components other the the visual merge tool, in order to get the free copy of the editor.
Before we start, check your installation by launching the tool from the Window's Start menu, pick two text files at random, and open the editor. You can also check the three way merge by going to the merge tab and loading three text files.
Ok, let's hook it into Git. Open up the Git Bash command line window, and your in your $HOME directory. Type "vi .gitconfig" and you'll open the vi editor to edit your .gitconfig file. Hit an "i" to insert text, and add the below text to the file, exactly as you see it below.
You don't have to worry about where p4merge.exe is located, it was added to your path during the installation. When your text looks exactly like the text shown, hit "esc" followed by ":wq" and your back to the command line. You can check your file took your changes with a "cat .gitconfig" at the git command line. Ok, shut down "Git Bash," and restart it, to read in your changes to the .gitconfig file into Git.
Let's run a test. Edit one of your files in one of your repository, do not run "git add" yet, instead run "git diff," and a difference should show up. Immediately type "git difftool" and your p4merge editor should appear with your files loaded.
Testing a three way merge is a little more difficult. To test your three way merge, edit a file in your remote repository, which could be on your local machine as a test, and commit it. Edit the same file in your local repository, then "git pull" from the remote repository, then perform a "git merge." What you've done is created a merge conflict.
When a conflict comes up, run "git mergetool" and you'll see your three files: the $BASE file, which is the file previously committed, the $LOCAL file, which is the file you changed on your local repository, the $REMOTE file, which is the file changed in the remote repository. When you edit the three files to one in the lower window, you'll create the $MERGED file. After you've save the file, and exited the editor, if you run git commit, you'll find that your conflict has been resolved. A git merge tool is a handy tool for resolving your merge conflicts, and one you now have configured to run whenever git shows a diff or merge conflict.