Git Rebase: A Powerful Way to Rewrite Commit History
Git rebase is a way to rewrite commit history by moving or modifying commits. It is often used to:
1. Understanding Rebase vs. Merge
Merge (git merge
)
- Creates a new "merge commit" that combines branches.
- Preserves the history of both branches.
- Can lead to a messy commit history with many merge commits.
Rebase (git rebase
)
- Moves or reapplies commits on top of another branch.
- Keeps history linear and clean.
- Avoids unnecessary merge commits.
Example:
git checkout feature-branch git rebase main
🔹 This moves all commits from feature-branch
to the latest main
.
2. Using Git Rebase
2.1 Rebasing a Feature Branch onto Main
If your feature-branch
is behind main
and you want to bring in the latest changes:
git checkout feature-branch git rebase main
🔹 This moves the commits from feature-branch
on top of main
.
If conflicts occur, resolve them and continue with:
git rebase --continue
To abort the rebase and go back:
git rebase --abort
3. Interactive Rebase (git rebase -i
)
Interactive rebase lets you edit, reorder, squash, or remove commits.
3.1 Start an Interactive Rebase
git rebase -i HEAD~3
🔹 This allows you to modify the last 3 commits.
You'll see a list like this:
pick a1b2c3 First commit
pick d4e5f6 Second commit
pick g7h8i9 Third commit
3.2 Modify Commits
Replace pick
with:
reword
→ Edit commit messageedit
→ Modify the commitsquash
→ Merge commitsdrop
→ Delete the commit
Example (squashing commits):
pick a1b2c3 First commit
squash d4e5f6 Second commit
pick g7h8i9 Third commit
🔹 This combines the Second commit into the First commit.
After saving, Git will prompt you to update the commit message.
4. Rebasing a Remote Branch
4.1 Force Push After Rebase
Since rebase rewrites history, you must force push:
git push --force
For a safer force push:
git push --force-with-lease
🔹 This prevents overwriting commits if someone else pushed changes.
5. Undoing a Rebase
If something goes wrong during rebase:
git reflog git reset --hard ORIG_HEAD
🔹 This restores your branch to before the rebase.
Conclusion
Action | Command |
---|---|
Rebase feature branch onto main | git rebase main |
Start interactive rebase (last 3 commits) | git rebase -i HEAD~3 |
Squash commits during rebase | Change pick to squash |
Undo a rebase | git reset --hard ORIG_HEAD |
Continue after fixing conflicts | git rebase --continue |
Abort rebase | git rebase --abort |
🔹 Use git rebase
to keep a clean commit history! Would you like a more detailed example? 🚀