stackademic

The leading education platform for anyone with an interest in software development.

Git Interactive Rebase

Rewrite, reorder, squash, and clean up commits before sharing them

Overview

Interactive rebase (git rebase -i) opens an editor listing commits so you can reorder, edit, squash, or drop them before publishing. It is the primary tool for polishing a messy feature branch into a clean, reviewable history. Only rebase commits that have not been shared, since rewriting published history disrupts collaborators.

Syntax / Usage

Start the interactive session against a base, then choose an action per commit in the todo list.

# Edit the last 4 commits
git rebase -i HEAD~4

# Rebase everything since diverging from main
git rebase -i origin/main

# In the editor, replace "pick" with an action:
#   reword  - change the commit message
#   edit    - pause to amend the commit
#   squash  - merge into previous, combine messages
#   fixup   - merge into previous, discard message
#   drop    - remove the commit entirely

Examples

Squash three work-in-progress commits into one clean commit:

git rebase -i HEAD~3
# mark the first as "pick", the rest as "fixup"
# result: a single commit with the first commit's message

Split or amend an older commit using edit:

git rebase -i HEAD~5
# set the target commit to "edit"; the rebase pauses there
git commit --amend
git rebase --continue

Reorder commits so a fix lands before the feature that needs it—just rearrange the lines in the todo list and save.

Common Mistakes

  • Rebasing commits already pushed and pulled by teammates
  • Force pushing with --force instead of the safer --force-with-lease
  • Deleting a commit with drop when you meant to squash it
  • Getting stuck mid-rebase and forgetting git rebase --abort to reset
  • Squashing so aggressively that meaningful history and context are lost

See Also

rebase commit branch