• An “edit collision” is the most common merge conflict. • It happens when two branches have changed the same part of the same file, and then those branches are merged together. • Git has trouble understanding which change should be used, so it asks you to help out.
• When this sort of conflict occurs, Git writes a special block into the file that contains the contents of both versions where the conflict occurred. <<<<<<< HEAD:index.html contact : [email protected] =======
>>>>>>> iss53:index.html • The top part (everything above the =======) is the version in HEAD, the branch being merging into (the master branch in our example). • The top part (everything below the =======) is the version in the iss53 branch
• In order to resolve the conflict, you have to either choose one side or the other or merge the contents yourself. For instance, you might resolve this conflict by replacing the entire block with this:
• This resolution has a little of each section, and the <<<<<<<, =======, and >>>>>>> lines have been completely removed. • After you’ve resolved each of these sections stage the file to mark it as resolved.
#! /usr/bin/env ruby def hello puts 'hello to all the world' end hello() $ git checkout -b master Switched to a new branch 'master' $ git commit -am 'Elaborated the greeting message’ [master 239e5b4] Elaborated the greeting message 1 file changed, 1 insertion(+), 1 deletion(-)
Before attempting a merge • Your working directory should be clean before attempting a merge. If you have work in progress, either commit it to a temporary branch or stash it. • This allows you to undo anything you try during the conflict resolution. • If you have unsaved changes in your working directory when you try a merge, getting back to a buildable, working code base isn’t as easy.
• Auto-generated project files that are not designed to be human readable. (.pbxproj, .sln, .storyboard) • Situations where a file has lots of complicated conflicts. • Multiple lines where both branches have made changes.
Strategy • Choose the version of the file in the branch being merged into (master in this example). • Then manually add the changes in branch being merged in (project-changes in the example). • Typically you know more about the branch being merged in than the branch being merged into.
• ‘Mine’ is the branch being merged into; master. • ‘Theirs’ is the branch being merged in from master’s perspective. • Note, if you are merging in your own branch, ‘Mine’ does not mean ‘my branch’.
• Reapply the changes that were implemented in the branch being merged in. • Make sure it builds. • Make sure it runs. • Make sure the tests pass. • (If you have them. You do have them right?) • If possible the 2 (or more) developers of each branch should work together to ensure everything works.
• Merge conflicts are unavoidable. • However, smaller more frequent conflicts are better and easier to deal with than large conflicts. • Conflicts become more troublesome as branches become more divergent. • In git-flow, a feature branch can become divergent from develop. • eg. new commits on develop after the feature branch was created.
• Look out for new commits on develop. • Notice the down-arrow indicating commits to pull from the remote. • Periodically merge develop into your feature branch. • Conflicts will be smaller when compared to leaving the feature to become divergent and then merging into develop.