Merging

Source: https://www.atlassian.com/cs/git/tutorials/using-branches/git-merge

Merging is the act of applying the changes from one branch onto another branch. The above visualization shows you 2 different branches which finally come together in a final commit which is accomplished by a merge.

Command

git merge <branch-name>

With this command the currently active branch “recieves” the changes from the branch in the given paramenter in the command

If we take the example from “branches” you can execute the following command to apply to changes from “small-feature” to the master branch. (It is required that you are currently on the master branch in the command line)

git merge small-feature

After that the following output will be shown

Updating 4bcd766..4d7056f
Fast-forward
 source.txt | 1 +
 1 file changed, 1 insertion(+)

With that the 1 line from the small-feature branch will be added to the file in the master branch.

Merge Conflict

GIT usually tries to merge the code itself as good as possible.

But sometimes GIT doesn’t know which side is correct and therefore produces a “merge conflict”.

When does a merge conflict occur?

A merge conflict occurs if you edit the same file at the same line in 2 different branches and try to merge these branches.

How does a merge conflict look like?

Lets stay with the example from “branches” but with the following adaptations:

  • On the master branch the content of source.txt has been changed from “master” to “master-old”.
  • On the small-feature branch the content from source.txt has been changed from “master” to “master-new”.

Now we perform a git merge small-feature while the master branch is active. With that we now get the following output:

Auto-merging source.txt
CONFLICT (content): Merge conflict in source.txt
Automatic merge failed; fix conflicts and then commit the result.

Now the content of source.txt looks like this:

<<<<<<< HEAD
master-old
=======
master-new
small-feature
>>>>>>> small-feature

As you can see GIT adds a few lines here:

  • <<<<<<<
    • Start of the merge conflict section
  • =======
    • Separates the 2 different content from the 2 given branches
  • >>>>>>>
    • End of the merge conflict section

How to solve a merge conflict?

Basically you have to manually “clean up” your source code, fix your logic and remove everything GIT added automatically.

In our example we want to stick with the changes from the master branch but also keep the new line from the small-feature branch.

With that our new content of our source.txt looks like this:

master-old
small-feature

After editing our file and looking at the git status we can see:

On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

    both modified:      source.txt

no changes added to commit (use "git add" and/or "git commit -a")

This means due to the fact, that we now edited our source.txt again, we have to add and commit our newly “merged” file again to the repositoy.

git add source.txt
git commit -m "merged"

The final git log looks something like this:

commit f9997203d5f7887ca30b4e69752291706d81755d (HEAD -> master)
Merge: dc50e32 2d79e70
Author: Kevin Pfeifer <kevin.pfeifer@sunlime.at>
Date:   Sat Jun 22 21:09:31 2019 +0200

    merged

commit dc50e3242da6cc17d822e3adf04ae4ca9edd62b1
Author: Kevin Pfeifer <kevin.pfeifer@sunlime.at>
Date:   Sat Jun 22 20:53:35 2019 +0200

    changed master to master-old

commit 2d79e708b4f7aa2dd4898a990bfd464b8a6080f4 (small-feature)
Author: Kevin Pfeifer <kevin.pfeifer@sunlime.at>
Date:   Sat Jun 22 20:53:14 2019 +0200

    changes master to master-new

commit b71b422594ecaf924909cd7477ee73b45a2c9685
Author: Kevin Pfeifer <kevin.pfeifer@sunlime.at>
Date:   Sat Jun 22 20:52:32 2019 +0200

    added small-feature

commit 3958f0b2f8f3f0473a6ef6194df4077ac4e45dc5
Author: Kevin Pfeifer <kevin.pfeifer@sunlime.at>
Date:   Sat Jun 22 20:52:21 2019 +0200

    master file created
Share this post

Leave a Reply

Your email address will not be published. Required fields are marked *

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

The reCAPTCHA verification period has expired. Please reload the page.