61 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
---
 | 
						|
title: Understand How to Use Git Merge
 | 
						|
---
 | 
						|
Let us say that you are working on an application that is similar to Reddit, but specifically for code snippets. In such an application, you would likely have a `master` branch which contains all the released features, a `dev` branch which might contain features that have been coded, but not implemented yet. Every developer in the team will create his own branches off the `dev` branch for individual features. The repository structure would look something like this:
 | 
						|
 | 
						|
                                      --- Commit 3 --------- dev branch 
 | 
						|
                                    /
 | 
						|
     --- Commit 1 ---- Commit 2 ---------------------------- master branch
 | 
						|
 | 
						|
If you decided to merge the 3rd commit (`Commit 3`) into the `master` branch from the `dev` branch, then it would be as simple as running a `git merge` command because the `dev` branch is _up-to-date_ with the `master` branch: all of the commits in the `master` branch exist in the `dev` branch. You can merge the branches by running the following commands:  
 | 
						|
 | 
						|
    git checkout dev
 | 
						|
    git merge master
 | 
						|
 | 
						|
The result would be something like this:
 | 
						|
 | 
						|
                                                   --------- dev branch 
 | 
						|
                                                 /
 | 
						|
     --- Commit 1 ---- Commit 2 ---- Commit 3 -------------- master branch
 | 
						|
 | 
						|
Now you decide to work on the authentication feature. To work on the authentication feature, you create another branch based on the `dev` branch and decide to call it `auth`. This is what the repo structure looks like:
 | 
						|
 | 
						|
                                                      ------ auth branch
 | 
						|
                                                    /
 | 
						|
                                                   --------- dev branch 
 | 
						|
                                                 /
 | 
						|
     --- Commit 1 ---- Commit 2 ---- Commit 3 -------------- master branch
 | 
						|
 | 
						|
If you were to commit any changes to the `auth` branch, merging them with the `dev` branch would be trivial because it is up-to-date with the `dev` branch. Now while you were working away on the authentication feature, one of the developers finished coding the syntax-highlighting feature, and decided to merge it with the `dev` branch. The repo looks like this now:
 | 
						|
 | 
						|
                                                      --- Commit 5 --- auth branch
 | 
						|
                                                    /
 | 
						|
                                                   --- Commit 4 ------ dev branch 
 | 
						|
                                                 /
 | 
						|
     --- Commit 1 ---- Commit 2 ---- Commit 3 ------------------------ master branch
 | 
						|
 | 
						|
Your branch, in Git terminology, is now a commit behind the `dev` branch. This means that you cannot simply merge the two branches: you must bring your `auth` branch up-to-date with the `dev` branch. This can be done with `git merge`!
 | 
						|
 | 
						|
Merging the `auth` branch with the `dev` branch, or the `dev` branch with the `master` branch is straightforward and does what you expect, but merging the other way around has its own idiosyncrasies that are not intuitive at first blush. I can babble about it, or I can show you another great diagram of what would happen if you merged the `dev` branch with the `auth` branch at this moment:
 | 
						|
 | 
						|
                                                      --- Commit 5 ----------- auth branch
 | 
						|
                                                    /               /
 | 
						|
                                                   --- Commit 4 -------------- dev branch 
 | 
						|
                                                 /
 | 
						|
     --- Commit 1 ---- Commit 2 ---- Commit 3 -------------------------------- master branch
 | 
						|
 | 
						|
See what I did there? Look at the diagram for a second and try to understand what is happening here before you move on. You essentially made another commit to the `auth` branch with the commits in the `dev` branch included. But that's all right, right? After all, at the end of the day I wanted to bring my `auth` branch up-to-date with the `dev` branch, and now it _is_ up-to-date? Yep. But let me show you a diagram to explicitly illustrate what the other diagram implies: Your `auth` branch now looks like this:
 | 
						|
 | 
						|
        --- Commit 5 ------- Commit 4 ------- auth branch
 | 
						|
      /                /
 | 
						|
    ------ Commit 4 --- --------------------- dev branch
 | 
						|
 | 
						|
See it now? You _copied_ the commit over. If you were to merge to the `dev` branch now, it would look something like this:
 | 
						|
 | 
						|
        --- Commit 5 ------- Commit 4 -------------------------------------- auth branch
 | 
						|
      /                /                  \
 | 
						|
    ------- Commit 4 ----------------------- Commit 5 ---- Commit 4 -------- dev branch
 | 
						|
 | 
						|
You merged the same commit twice! This will of course have no repercussions for your code itself, but if you one fine day decide to look at your `git logs`, you will immediately realize how dirty your git history is, with some commits being made over and over. If you wanted to revert to a commit, it would be very difficult to decide which commit to revert to.
 | 
						|
 | 
						|
It is preferred that to you use <a href='http://forum.freecodecamp.com/t/how-to-use-git-rebase/13226' target='_blank' rel='nofollow'>Git-Rebase</a>. |