UP | HOME

Git rebase vs merge

1 Merge

Given two branches master and feature, merging feature into master will create a commit that will be the descendent of both branches, thus capturing all the changes made in both branches. This commit will set at the tip of master. If the tip of feature is a linear descendent of the tip of master, then this is called a fast forward merge, since the histories of the branches do not diverge, feature can be seen as a continuation of master history.

1.1 Example

----Before---

       master
         |
A--B--C--D
   \         
    \       
     E--F--G
           |
        feature

----After----

           master
              |
A--B--C--D----H
   \         /
    \       /
     E--F--G
           |
        feature

1.2 Example of a fast forward merge

----Before---

       master
         |
A--B--C--D
          \         
           \       
            E--F--G
                  |
               feature
       
----After----

A--B--C--D----H
              \         
               \      
                E--F--G
                      | 
                feature, master

2 Rebase

In contrast, given feature and master, rebase will re-write the commits of feature as if they had started from the tip of master. Think of feature as containing some diffs. Then, rebase applies those diffs starting at the tip of master

2.1 Important notes

You can mess about all you want in your local version of feature. rebase let's you re-write history, squash commits together, etc. But you should only do this on your local version. Once it's pushed, you should use revert to undo anything you might want to undo.

2.2 Example

----Before---

       master
         |
A--B--C--D
   \         
    \       
     E--F--G
           |
        feature

----After----

       master
         |
A--B--C--D
         \         
          \       
           E'--F'--G'
                   |
                feature

3 Re-writing history

You can use rebase -i to edit previous commits. You can use git commit --amend to change the last commit, e.g. to add a file you forgot or change the commit message.

3.1 Helpful links

Created: 2021-09-14 Tue 21:43