Join Kevin Skoglund for an in-depth discussion in this video Resolving merge conflicts, part of Git Essential Training.
In the last movie we learned about merge conflicts, and we actually created one in our Explore California site. That's where we left things off. We left things in the middle of a merge, the merge has not yet been completed, and Git wants us to resolve these conflicts before it will go ahead and complete the merge. What I want us to look at in this movie is how we go about resolving these conflicts. You've three choices as to what to do to resolve these conflicts. First, you can simply abort the merge. You can say oops! That was not what I wanted to do, I was not anticipating all of these problems, get me out of here.
We'll see how to do that. The second is that we can resolve the conflicts manually. Most of the time this is what you're going to do, and I think especially while you're learning how to resolve these conflicts, I think this is the one that you want to do. And then the third one is that you can use a merge tool. There're number of tools out there that will help you to resolve these kinds of conflicts. Now I'm not going to teach you any specific one of those, because there are so many, and my advice would not be go to a Merge tool until you've spent some time resolving them manually. So that you have an idea what the tools are doing for you, and you won't be entirely dependent on them in order to resolve merges.
So let's look at the first one of these, aborting the merge. To abort the merge, while we're in this state, all we have to do is say, git merge --abort. That's it. Now notice I'm no longer in my MERGING state, git status, everything is clean, and if I do git log --oneline on my master branch, you can see that it did not bring anything else. This is the state of things right before the merge. So nothing got merged, I simply aborted it. Now let's do our merge again, git merge text_ edits, once again it did the same thing, created the same conflicts for us.
This time we're going to soldier on, and we're going to resolve the conflicts manually, so the problem was in mission.html. So we can see that again, git status shows us that. What we need to do is we need to resolve the conflicts by hand in mission.html, and then add and commit the result. So that's what we're going to do. Let's open up mission.html. Now we saw before that the markers here, this arrows pointing to the left, going down to the equal sign all way down here to the arrows pointing to the right, is how we know where the conflicts are.
If there had been several of these conflicts it would've marked each one of them. Maybe there's one at the top of the document, one in the middle, one at the bottom, and each one would be a section. So every time there's a problem, you want to just search your document looking to see where the first one of these is. So the best thing to do is here at the top of your document, you do a find and find three of those. So there we go. Now I know I'm right here at the first commit. Now you can go through these line by line and try and sort it all out. You also could do some research here. You can say, all right, let's go back, and let's remind ourselves if we do git log --oneline, let's just do 3 of those.
All right, here's that commit. What was that commit all about? Let's see, git show, let's take a look at that commit. Okay, and you can look through there, and you can see oh, all right, I was doing the curly quotes here, that's really what changed was the curly quotes. So I know that what I need to do is I need to take the version that is in text_edits, this version, there're lot of text_edits in there. So I'm just going to take that and assume that that's the right one, so what I'm going to do is I'm going to go through and make sure that I get all of the curly quotes in there. So let's do--we'll take our single quotes, and let's come down here and look for single quotes that need to be changed, and here's another one, and I am not sure if I've got them all or not, but then I know I need to change this one, this is left double quote, this one is right double quote.
Okay, so that looks pretty good, oh, here's another one, California's people. Okay, so now I have all of the changes in the text_edits version, this is the one I want to keep, so I need to actually remove this from the document. I'm now going to also remove the lines with the equal signs, come down here and remove the ending arrows as well. So now, the document is a regular HTML document, it has all of the changes in there. Let's save it, and let's go ahead and just open up Firefox and then reload the page.
All right, so you'll want to inspect it and make sure that it all looks good, make sure that you're completely happy with the results, that the merge conflict has been resolved to your satisfaction. And once you're completely happy with it and all of the changes have been made, save it and close it. We'll come back over here, and we need to tell it that it needs to add mission, git add mission.html. Now git status, shows that it is ready to be committed, we're ready to do the commit. Now we know how to do a commit, git commit. Normally we'd put a message after it.
You can put a message if you want to provide the commit message, but you don't have to. When you're in the middle of a merge, it has a standard default message that it would use. So just git commit by itself, and it'll use that default message. So git commit, hit Return, it in this case popped up and asked me, I'm going to remove this list of conflicts here because those are gone now, and then I'll just save that, close it, and it says, all right, Merge branch 'text_edits'. Now if we do git status, we don't have anything in there. Let's do git log --oneline. Let's look at just the last 3, or I'll do the last 4.
Now we see we have our merge in there, it has that merge commit, and if we ask it git branch --merged, it does list text_edits as being fully merged into the master branch. So that's it, that's the steps. You open up the files that have a conflict, find the spot where there are problems, manually fix them, do that for all the files that had a conflict. If there were 20 files that had conflicts, you'll do it for all 20 of them. Then add those files to the staging index, and when you're ready git commit will complete the merge and all those merge conflicts will be resolved.
One last thing I want to show you, if you remember I told you that there was this nice future in git log where we could use --graph, git log --graph, and we'll use a couple of other options; --oneline, --all, -decorate, here we are. So if we use all of these together, look what we get. We get a nice showing of the different branches and what happened. Here's the shorten_title branch. You can see where it got folded back in. Here's our merge commit right here that does that. You see, this was a fast-forward one for the seo_title, so it doesn't branch out, it doesn't need this merge commit here. And then we've merged this one back in here, so you can see text_edits is still at this point in time and the HEAD and master have this merge commit in them as well.
So it's nice because it gives you a graphical representation of what you've been doing with all of your branching and merging. Now of course, I mentioned there was a third option which is that you could use a merge tool when you're in that state where you're in between merges, and it hasn't been resolved, you could type git mergetool and then --tool= and then the name of the tool that you want. And the Help will show you all of the different tools that you can use, just typing it by itself will show you all of the different candidates that you could use there. So you could go and look up how these work, see if there's one that you like or feel comfortable with it, and you can also add that to your git config file if you want to always use a certain tool.
Again, I'm not going to show you any specific one of these, I want you to really stick with the basics of resolving them manually first. It's a more advanced thing to start using these merge tools.
- Exploring the history of version control
- Installing Git on Mac, Windows, and Linux
- Initializing a repository
- Writing useful commit messages
- Understanding the Git three-tree architecture
- Tracking when files are added, edited, deleted, or moved
- Viewing change sets and comparing versions
- Undoing changes and rolling back to previous versions
- Ignoring changes to select files
- Creating and working with code branches
- Merging branches and resolving merge conflicts
- Stashing changes for later
- Working with hosted repositories and remote branches
- Developing an effective collaboration workflow
Skill Level Beginner
Q: In the Chapter 10 movie "Configuring the command prompt to show the branch," when I type the function "__git_ps1," I do not get the expected result.
A: The function "__git_ps1" was recently moved to a new file, .git-prompt.sh, as described here: https://github.com/git/git/commit/af31a456b4cd38f2630ed8e556e23954f806a3cc.
We will update the video. In the meantime, you may do the same steps you do for .git-completion.bash, but a second time using ".git-prompt.sh" as shown here: https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh.
Q: When I use the code the instructor advises in the above video ("git config --global user.name "Nelda Street"), I still get an "Illegal Instruction" error. I have OS 10.6.8. Am I doing something wrong?
A: The current installer version of git isn't compatible with older Mac OS versions.
1. To add "-mmacosx-version-min=10.6" as described here:https://stackoverflow.com/questions/14268887/what-is-the-illegal-instruction-4-error-and-why-does-mmacosx-version-min-10https://stackoverflow.com/questions/10177038/illegal-instruction-4-shows-up-in-os-x-lion
2. Or to use the version of git that comes with Xcode, or to use homebrew to install git instead.http://superuser.com/questions/697144/installed-git-not-sure-how-to-get-it-working