📚 Key Takeaways: Transform messy merge commits into a clean, linear history with interactive rebase. Squash, reword, and reorder commits for a professional git workflow.
Your git history looks like a spaghetti bowl? Merge commits everywhere? Interactive rebase is the cure.
❌ The Mess – Merge Hell
git log --oneline --graph * f3a2b1c Merge branch 'feature' into main |\ | * e4d5c6f WIP: feature work in progress | * a1b2c3d Another WIP: still not working | * b2c3d4e Fix bug #123 | * c3d4e5f Feature: add new endpoint |/ * d4e5f6g Initial commit # Ugly, hard to read, and full of "WIP" commits
✅ The Solution – Interactive Rebase
# Start interactive rebase (last 5 commits) git rebase -i HEAD~5 # Editor opens with commits: pick c3d4e5f Feature: add new endpoint fixup b2c3d4e Fix bug #123 # Squash into previous squash a1b2c3d Another WIP # Squash into previous squash e4d5c6f WIP: feature # Squash into previous # After rebase: git log --oneline --graph * 9a8b7c6 Feature: add new endpoint (clean!) * d4e5f6g Initial commit # Beautiful linear history! ✨
🎯 Common Rebase Commands
pick = use commit reword = change commit message edit = stop to modify commit squash = combine with previous commit fixup = combine, discard message drop = remove commit # Example: Clean up 5 commits into 2 pick a1b2c3d Add user authentication squash c3d4e5f Fix authentication bug squash e4d5c6f Refactor auth code pick f5g6h7i Add user profile page squash g7h8i9j Fix profile UI # Result: 2 clean commits
💡 Pro Tip: Force Push with Safety
# Push rebased branch (with safety) git push --force-with-lease # Instead of git push --force (dangerous!) # --force-with-lease checks remote before overwriting # Or set default git config --global push.default current
📊 Before & After
| Metric | Before (Merge) | After (Rebase) |
|---|---|---|
| Commit Count | 8 commits | 3 commits |
| WIP Commits | 3 | 0 |
| Merge Commits | 1 | 0 |
| Readability | 😫 Hard | 😍 Clean |
| Bisect Friendly | ❌ No | ✅ Yes |
