I recently needed to squash the first two commits in one of my Git repositories. As usual, I ran the
git rebase -i command to do an interactive rebase, but I noticed that the root commit didn't appear in the list of commits.
Here's what my Git history looked like:
$ git log --graph --oneline * fe2c946 (HEAD -> main) More changes * 2702f8b Small tweaks * ffb98dd Initial commit
When I ran
git rebase -i ffb98dd, this was the output I got (omitted for brevity):
pick 2702f8b Small tweaks pick fe2c946 More changes # Rebase ffb98dd..fe2c946 onto ffb98dd (2 commands) # ...
As you can see, the second commmit
2702f8b and the third commit
fe2c946 were listed, but the initial commit
ffb98dd wasn't. So how do you squash the second commit into the root commit if the root commit isn't listed?
The solution for this problem was introduced in Git 1.17.12. We can now specify the
--root flag for the
rebase command to rebase all reachable commits up to the root:
$ git rebase -i --root
This allows us to rewrite the Git history down to the root commit. Now, the output includes the root commit
ffb98dd in the first line:
pick ffb98dd Initial commit pick 2702f8b Small tweaks pick fe2c946 More changes # Rebase fe2c946 onto 6fafbe0 (3 commands) # ...
We can use the
squash command in the second line to combine
2702f8b into a single commit:
pick ffb98dd Initial commit squash 2702f8b Small tweaks pick fe2c946 More changes # Rebase fe2c946 onto 6fafbe0 (3 commands) # ...
Now, we need to choose a message for the new combined commit. I kept "Initial commit" since it's still an accurate description. Once the command completes, the Git history looks like this:
* bfd9495 (HEAD -> main) More changes * 34901ec Initial commit
And there we go! The changes made in the "Small tweaks" commit
2702f8b have been folded into our initial commit. Using the
--root option with the
rebase command, we were able to squash the first two commits into a single one.