Resolving merge conflicts in Git
Why would my Merge Fail?
There are 3 scenarios that could result in a Failed Merge.
- Changes are only in your working directory
- Changes are staged by not committed
- Changes are committed but Git could not resolve merge on its own
Tools
Tools and example output when in a merge conflict situation.
git status
The git status command provides an overview of all files that have been modified and are in conflict at the time of the merge.
Example:
# Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: <Some file> # # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # unmerged: <file> #
- "Changes to be committed": All changes to files that are not affected by the conflict are staged.
- "Changes but not updated": All files that have conflicts that must be resolved before repository will be back to working order.
git stash
Stashes away any changes in your staging area and working directory. This command is useful in saving all changes not ready to be committed and the user wants to have an updated repository.
git stash save "<Save Message>": Save changes to files in working directory and staging area that git is aware of
git stash save "Saved changes for stash example" Saved working directory and index state "On master: Saved changes for stash example" HEAD is now at 4e2b407 Added second file for example.
git stash list: List the stashes that you currently saved
git stash list stash@{0}: On master: Saved changes for stash example
git stash pop <stash@{#}>: Removes the most recent stash or any stash specified and applies changes as a merge. If merge fails the stash is not removed from the list and must be removed manually.
git stash apply <stash@{#}>: Applies changes of recent stash or any stash is list specified, but doesn't remove it from the list.
git stash drop <stash@{#}>: Removes the most recent stash or any stash specified from the list.
git stash clear: Removes all stash's stored in the list
How do I find conflicts in a file?
Conflicts are marked in a file with clear line breaks
<<<<<<< HEAD:mergetest This is my third line ======= This is a fourth line I am adding >>>>>>> 4e2b407f501b68f8588aa645acafffa0224b9b78:mergetest
<<<<<<<: Indicates the start of the lines that the user currently has committed and start of lines involved in merge conflict
>>>>>>>: Indicates the end of the lines that are trying to be merged into the user's tree and the end of lines involved in merge conflict
=======: Indicates the break point used for comparison. Breaks up changes that user has committed (above) to changes coming from merge (below) to visually see the differences.
Scenarios
Git refuses to start a merge/pull
Error Messages:
- error: Entry '<fileName>' not uptodate. Cannot merge. (Changes in working directory)
- error: Entry '<fileName>' would be overwritten by merge. Cannot merge. (Changes staged, but not commited)
Steps toward Resolution:
- git stash save "<Message that describes what is being Saved>" (Stashes away any changes in your staging area and working directory in a separate index.)
- git status ( Verify all changes are staged)
- git stash list (Lists all stash's user has)
- git pull or git merge (Bring in changes from central repository or another branch)
- git stash pop (Will repopulate your changes into your working directory, maybe have to resolve merge conflicts)
Git is unable to resolve a merge/pull
Error Message:
CONFLICT (content): Merge conflict in <fileName> Automatic merge failed; fix conflicts and then commit the result.
Steps toward Resolution:
- git status (Shows all files that are in conflict as unmerged changed in working directory.)
- Resolve Merge confilicts
- git add <files>
- git commit -m "<Informative commit message>"