Are Git conflicts your biggest nightmare? Do you freak out when you get a conflict?
I promise that at the end of this Git merge conflict tutorial you will be resolving conflicts without any headaches.
To simplify the merging explanations I will be referring to my-branch
and his-branch
, but you can substitute them for yours.
What you will learn:
- How does Git merge conflict happen?
- How to prepare for merge
- How to abort Git merge process
- How to resolve Git merge conflict
- How to use Diff3 view
How does Git merge conflict happen?
The merge conflicts happen when someone else edits the same lines of code in his branch as you edit in your branch.
In our example we have colors.txt
file in the master branch and both of the other branches have a commit that has changed this file.
// colors.txt // in master, you have both created a branch from here red yellow blue // commit in your branch red green blue // commit in his branch red white blue
Do you see how the same file has a different content in both branches and the same line modified?
This would cause a merge conflict.
1. Clean table
Firstly commit or stash all of your current changes, your branch needs to be “clean” before merging.
Also if you haven’t already, switch to his-branch and pull his latest changes.
// in your branch // commit or stash changes and switch to his branch git commit -a -m "some message" git stash git checkout his-branch // in his branch // pull his changes and switch back to yours branch git pull git checkout -
If you run git status
you should see nothing to commit, working tree clean
.
Are you new to Git? Checkout also this Git branches tutorial.
2. Git Merge
Now you are ready to merge his branch.
// in your branch git merge his-branch
This will try to merge all his changes into your branch.
Because you have both modified colors.txt
on the same line, you have to resolve this a merge conflict manually.
The green block shows your changes and calls them Current change.
The blue block shows his changes in his branch and calls them Incoming changes.
Aborting merge conflicts
If you don’t feel comfortable resolving the conflict you can always abort the merge process.
// in your branch git merge --abort
This will return you to the state of your repo before you have started the merge process.
3. Resolving Git merge conflict
To resolve the conflict we have 3 options:
- Accept current change
- Accept incoming change
- Accept both changes
// resolved colors.txt // Accept current change red green blue // Accept incoming change red white blue // Accept both changes red green white blue
This seems to be straight forward on our simple example, but I know it can be overwhelming to look at especially if your merge conflict involves big blocks of code.
One thing that helped me with merge conflicts is to use DIFF3. More on that later.
4. Commit resolved conflict
Based on your scenario pick one of the options above for every conflict and save the file.
If you have more conflicted files you will need to open them and resolve them too.
Once you have resolved all conflicts in all files you will need to stage them and commit.
// stage all files git add . // commit git commit -m "merged his-branch" // shorter version of the above git commit -a -m "merged his-branch"
If everything went well you should see a new commit made on your branch, your working tree clean and the merge process completed.
An easier way to look at merge conflicts
To make it easier to resolve merge conflicts I prefer to use the DIFF3 view.
When you enable diff3 you will see a 3 way view.
- the original version – merged common ancestor
- current change
- incoming change
Yellow
was the original color, I have changed it to green
and he has changed it to white
.
To enable Diff3
you need to add it to your Git config
.
git config merge.conflictstyle diff3
To find out more about Git config checkout out this Git config tutorial.
Conclusion
Resolving Git conflicts can be very frustrating and stressful situation, but hopefully this Git tutorial gave you a lot more confidence to resolve conflicts in Git.
Do you have any tips or tricks when it comes to resolving Git conflicts? Let me know in the comments.