Git Rebase Explained Simply
Tags: git, tutorial, productivity, beginners
Published: 2020-01-03 04:12:25

Rebase might be the most misunderstood git command.

Nearly every junior developer I pair with is terrified of `git rebase`.

Ironically, `rebase` is one of the few git commands I find myself using almost daily. Generally speaking, I rebase at least once for every pull request I make on GitHub.

I rebase to ensure that my commit messages make sense and that my branch won't have any serious, unexpected merge conflicts.

Using the `git rebase` command doesn't have to be complicated or intimidating, once you've got a handle on how it works and why it is useful.

Imagine you have two branches.

The first one looks like this:
```
3def6294 One more change that I made
579db95b Another change I made
f261ebba Some change that I made
13363dd3 Rails 5.2 features: enable cache ...
73188cd8 Sidekiq: add test helpers (#5326)
ba424854 Enable cache logging in development if requested (#5330)
51df3255 Change MentionJob to MentionWorker ...
```

The second one looks like this:
```
242c6eb5 Change from after_create to ...
c64bfdb6 Handle missing commentable ...
cb98b3b5 pages bust cache job sidekiq refactor (#5338) [deploy]
df042d6b Refactors ActiveJob ...
783d43b7 Change create first reaction job to worker (#5327) [deploy]
c1638cfd Create UpdateAnalyticsWorker to replace UpdateAnalyticsJob (#5331)
040b36bc Fix event propagation for click on tag rules in editor (#5280) [deploy]
ba230eca Allow language-xxx class detection on pre tags in ReverseMarkdown (#5299)
13363dd3 Rails 5.2 features: enable cache ...
73188cd8 Sidekiq: add test helpers (#5326)
ba424854 Enable cache logging in development if requested (#5330)
51df3255 Change MentionJob to MentionWorker ...
```

If you're looking closely, you'll have noticed that these two branches are identical from their bases until `13363dd3`, where they diverge.

The first branch, which I'll refer to from now on as our working branch, has three commits that don't exist in the second branch.

The second branch, which I'll call master in this example, has eight commits that don't exist in our working branch.

In reality, it's extremely easy to end up in this situation. You can easily replicate this by working on a project with many other developers (like DEV) when you create a feature branch.

If your feature branch exists for a few days, it's likely that master will change before you are able to merge your branch back into master.

In that case, it'd be really convenient if you could catch your feature branch back up to master and bump your changes to the top of the git history.

If we caught our working branch back up to master and put those three commits on top, it might look like this:

```
3def6294 One more change that I made
579db95b Another change I made
f261ebba Some change that I made
242c6eb5 Change from after_create to ...
c64bfdb6 Handle missing commentable ...
cb98b3b5 pages bust cache job sidekiq refactor (#5338) [deploy]
df042d6b Refactors ActiveJob ...
783d43b7 Change create first reaction job to worker (#5327) [deploy]
c1638cfd Create UpdateAnalyticsWorker to replace UpdateAnalyticsJob (#5331)
040b36bc Fix event propagation for click on tag rules in editor (#5280) [deploy]
ba230eca Allow language-xxx class detection on pre tags in ReverseMarkdown (#5299)
13363dd3 Rails 5.2 features: enable cache ...
73188cd8 Sidekiq: add test helpers (#5326)
ba424854 Enable cache logging in development if requested (#5330)
51df3255 Change MentionJob to MentionWorker ...
```

Doing something like that would make a pull request against master much cleaner and help us avoid merge conflicts.

Luckily, that is effectively what rebasing a branch does!

Let's talk about the name of this command: Rebase. What does that mean?

If you think of these two git branch like a tree trunk (the tree metaphor is constant in git), you can imagine that we'd like to replace the base of our working branch with the base of our master branch.

In other words, we'd like to "re-base" the working branch with the master branch.

Let's walk through a rebase.

I almost always use the `-i` (aka interactive) flag when I rebase because it makes it easier to reword commit messages, squash commits, or resort the order of commits. Those features of the `git rebase` command are beyond what I want to get into in this article, so we'll skip that for now, but I encourage you to try out the interactive flag.

Instead, assuming we have `working-branch` checked out on our local machine, rebasing is this simple:

```shell
git rebase master
```
You'll see some console output:

```
First, rewinding head to replay your work on top of it...
Applying: Some change that I made
Applying: Another change I made
Applying: One more change that I made
```

You can see that git is "replaying" our work, like a recording, on top of the master branch. That's not a bad metaphor for understanding how rebase works either.

When we log out our git history, you'll see that our changes have been replayed on top of the master branch.

```
3def6294 One more change that I made
579db95b Another change I made
f261ebba Some change that I made
242c6eb5 Change from after_create to ...
c64bfdb6 Handle missing commentable ...
cb98b3b5 pages bust cache job sidekiq refactor (#5338) [deploy]
df042d6b Refactors ActiveJob ...
783d43b7 Change create first reaction job to worker (#5327) [deploy]
c1638cfd Create UpdateAnalyticsWorker to replace UpdateAnalyticsJob (#5331)
040b36bc Fix event propagation for click on tag rules in editor (#5280) [deploy]
ba230eca Allow language-xxx class detection on pre tags in ReverseMarkdown (#5299)
13363dd3 Rails 5.2 features: enable cache ...
73188cd8 Sidekiq: add test helpers (#5326)

...

```

In other words, we "re-based" our branch with master.

If using rebase still scares you, try making a copy of your working branch before you run the rebase command, just to be safe!

### There's more...

I'm writing [a lot of articles](https://jh.codes) these days, I run a [podcast](https://www.devpath.fm), and I've started sending out a [newsletter digest](https://pages.convertkit.com/674caf55d4/f30f7753a7) about all of the awesome stories I'm hearing.

You can also follow me on [Twitter](https://twitter.com/jakeherrington), where I make silly memes and talk about being a developer.