Advanced Git Operations
Overview
Advanced git commands for complex workflows, history manipulation, and debugging. Use this skill for rebasing, cherry-picking, finding bugs, and recovering from mistakes.
When to Use
- •Rebasing branches and cleaning history
- •Cherry-picking specific commits
- •Finding which commit introduced a bug
- •Recovering lost commits
- •Complex merge scenarios
- •Stash management
Interactive Rebase
Start Rebase
bash
git rebase -i HEAD~5 # Last 5 commits git rebase -i main # Onto main git rebase -i --root # All commits
Rebase Commands
| Command | Action |
|---|---|
pick | Keep commit as-is |
reword | Change commit message |
edit | Stop to amend commit |
squash | Combine with previous |
fixup | Combine, discard message |
drop | Remove commit |
exec | Run shell command |
Common Rebase Operations
bash
# Squash last 3 commits git rebase -i HEAD~3 # Change 'pick' to 'squash' for commits to combine # Reorder commits git rebase -i HEAD~5 # Reorder lines in editor # Edit commit message git rebase -i HEAD~3 # Change 'pick' to 'reword' # Split a commit git rebase -i HEAD~3 # Change 'pick' to 'edit' git reset HEAD~ git add -p && git commit git add -p && git commit git rebase --continue
Rebase onto Branch
bash
git rebase main # Rebase current onto main git rebase main feature # Rebase feature onto main git rebase --onto main A B # Rebase B onto main, starting from A
Abort/Continue
bash
git rebase --continue # After resolving conflicts git rebase --skip # Skip current commit git rebase --abort # Cancel rebase
Cherry-Pick
bash
git cherry-pick <commit> # Apply single commit git cherry-pick A B C # Multiple commits git cherry-pick A..B # Range (exclusive A) git cherry-pick A^..B # Range (inclusive A) git cherry-pick -n <commit> # No auto-commit git cherry-pick -x <commit> # Add source reference git cherry-pick --abort # Cancel git cherry-pick --continue # After conflict
Cherry-Pick from Another Branch
bash
git log other-branch --oneline # Find commit hash git cherry-pick abc123 # Apply it
Git Bisect (Find Bug)
Basic Bisect
bash
git bisect start # Start bisecting git bisect bad # Current commit is bad git bisect good v1.0 # Known good commit # Git checks out middle commit # Test and mark: git bisect good # This commit is OK git bisect bad # This commit has bug # Repeat until found git bisect reset # End bisect
Automated Bisect
bash
git bisect start HEAD v1.0 git bisect run npm test # Auto-run test git bisect run ./test-script.sh # Custom script # Script: exit 0 = good, exit 1 = bad
Bisect Log
bash
git bisect log # Show bisect history git bisect log > bisect.log # Save for replay git bisect replay bisect.log # Replay session
Reflog (Recovery)
View Reflog
bash
git reflog # HEAD history git reflog show main # Branch history git reflog --date=relative # With timestamps
Recover Lost Commits
bash
# After bad reset
git reflog
git reset --hard HEAD@{2} # Go back 2 moves
# Recover deleted branch
git reflog
git checkout -b recovered HEAD@{5}
# Find lost stash
git fsck --unreachable | grep commit
git show <commit>
Stash Management
Basic Stash
bash
git stash # Stash changes git stash -u # Include untracked git stash -a # Include ignored git stash push -m "message" # With message git stash push path/to/file # Specific files
List & Apply
bash
git stash list # List stashes
git stash show # Show latest diff
git stash show -p stash@{1} # Full diff
git stash apply # Apply latest
git stash apply stash@{2} # Apply specific
git stash pop # Apply and remove
git stash drop stash@{1} # Remove stash
git stash clear # Remove all
Branch from Stash
bash
git stash branch newbranch # Create branch from stash
Reset vs Revert
Reset (Rewrite History)
bash
git reset --soft HEAD~1 # Undo commit, keep staged git reset --mixed HEAD~1 # Undo commit, unstage (default) git reset --hard HEAD~1 # Undo commit, discard changes git reset --hard origin/main # Match remote exactly
Revert (Safe, Creates Commit)
bash
git revert <commit> # Revert single commit git revert HEAD~3..HEAD # Revert range git revert -n <commit> # No auto-commit git revert -m 1 <merge-commit> # Revert merge
Amending
bash
git commit --amend # Edit last commit message git commit --amend -m "new msg" # Replace message git commit --amend --no-edit # Add staged, keep message git commit --amend --author="Name <email>" # Fix author
Clean & Prune
bash
git clean -n # Dry run git clean -f # Remove untracked files git clean -fd # Include directories git clean -fX # Only ignored files git gc # Garbage collect git prune # Remove unreachable objects
Worktrees
bash
git worktree list # List worktrees git worktree add ../feature feature-branch git worktree add ../hotfix -b hotfix git worktree remove ../feature # Remove worktree git worktree prune # Clean stale
Blame & Log
bash
git blame <file> # Who changed each line git blame -L 10,20 <file> # Lines 10-20 git log -p <file> # File history with diffs git log --follow <file> # Follow renames git log -S "searchterm" # Commits adding/removing text git log -G "regex" # Commits matching regex git log --all --oneline --graph # Visual history
Patches
bash
git format-patch HEAD~3 # Create patch files git format-patch main..feature # Branch patches git apply patch.patch # Apply patch git am patch.patch # Apply as commit
Troubleshooting
| Scenario | Solution |
|---|---|
| Undo last commit | git reset --soft HEAD~1 |
| Undo pushed commit | git revert <commit> |
| Wrong branch commit | Cherry-pick to correct branch |
| Lost commits | git reflog to find and recover |
| Bad rebase | git rebase --abort or reflog |
| Merge conflict hell | git merge --abort and retry |
| Detached HEAD | git checkout -b newbranch |