For this week's lab(3), I practiced merging with conflict. I chose to add two features on my goURL program. Then, I filed two issues on Github.
Before this lab, all the coding happens on the master branch. So I made two more branches. These two branches all based on the current state of master.
git branch issue-5 git branch issue-6
Then I started work on issue-5 branch
git checkout issue-5. After I finished all the coding
git commit -m "issue-5 finished". Then, I merged this branch to master
git checkout master git merge
This is a
Fast-forward merge. Because the commit pointed to by the branch issue-5 was directly ahead of the commit on the master branch.
After the Fast merge, I started work on issue-6
git checkout issue-6. The coding part goes smoothly.
git commit -m "issue-6 finished" git checkout master git merge issue-6
Automatic merge failed.
# aborting a merge git merge --abort
Git adds standard conflict-resolution markers to the files that have conflicts.
<<<<<<< HEAD:index.html aaaaaaa ======= bbbbbbbbbbb >>>>>>> issu-6:index.html
After you’ve resolved each of these sections in each conflicted file, run
git add on each file to mark it as resolved. Staging the file marks it as resolved in Git.
In my situation, too many markers on my main.go. So I found another way to solve the conflict. I am a vim user, and git can specify the mergetool.
git config --global merge.tool vimdiff
After I run
git mergetool, vimdiff was executed.
Local changes (master branch in this case) are in the upper-left window, followed by a closest common ancestor and the issue-6 branch in the upper-right corner. The result of the merge is in the bottom window.
- LOCAL: This is the file from the current branch (or whatever you're merging into)
- BASE: The common ancestor—how the file looked before both changes took place
- REMOTE: The file you are merging from another branch (issue-6)
- MERGED: The merge result—this is what gets saved as output
:diffget REMOTE or :diffg R to get the REMOTE version. Same as
:diffget BASE :diffget LOCAL.
]c [c move by changes. Repeat for every conflict and then run
git commit -m "issue 5 and issue 6 conflict resolved"
It's a long and fun journey to create and deal with the conflict. It simulates the methods when we all work parallel in the opensource world.