| name | git-advanced-workflows |
| description | Master advanced Git workflows including rebasing, cherry-picking, bisect, worktrees, and reflog to maintain clean history and recover from any situation. Use when managing complex Git histories, collaborating on feature branches, or troubleshooting repository issues. |
Git Advanced Workflows
Master advanced Git techniques to maintain clean history, collaborate effectively, and recover from any situation with confidence.
When to Use This Skill
- Cleaning up commit history before merging
- Applying specific commits across branches
- Finding commits that introduced bugs
- Working on multiple features simultaneously
- Recovering from Git mistakes or lost commits
- Managing complex branch workflows
- Preparing clean PRs for review
- Synchronizing diverged branches
Core Concepts
1. Interactive Rebase
Interactive rebase is the Swiss Army knife of Git history editing.
Common Operations:
pick: Keep commit as-is
reword: Change commit message
edit: Amend commit content
squash: Combine with previous commit
fixup: Like squash but discard message
drop: Remove commit entirely
Basic Usage:
git rebase -i HEAD~5
git rebase -i $(git merge-base HEAD main)
git rebase -i abc123
2. Cherry-Picking
Apply specific commits from one branch to another without merging entire branches.
git cherry-pick abc123
git cherry-pick abc123..def456
git cherry-pick -n abc123
git cherry-pick -e abc123
3. Git Bisect
Binary search through commit history to find the commit that introduced a bug.
git bisect start
git bisect bad
git bisect good v1.0.0
git bisect good
git bisect reset
Automated Bisect:
git bisect start HEAD v1.0.0
git bisect run ./test.sh
4. Worktrees
Work on multiple branches simultaneously without stashing or switching.
git worktree list
git worktree add ../project-feature feature/new-feature
git worktree add -b bugfix/urgent ../project-hotfix main
git worktree remove ../project-feature
git worktree prune
5. Reflog
Your safety net - tracks all ref movements, even deleted commits.
git reflog
git reflog show feature/branch
git reflog
git checkout abc123
git branch recovered-branch
git reflog
git branch deleted-branch abc123
Practical Workflows
Workflow 1: Clean Up Feature Branch Before PR
git checkout feature/user-auth
git rebase -i main
git push --force-with-lease origin feature/user-auth
Workflow 2: Apply Hotfix to Multiple Releases
git checkout main
git commit -m "fix: critical security patch"
git checkout release/2.0
git cherry-pick abc123
git checkout release/1.9
git cherry-pick abc123
git cherry-pick --continue
git cherry-pick --abort
Workflow 3: Find Bug Introduction
git bisect start
git bisect bad HEAD
git bisect good v2.1.0
npm test
git bisect bad
git bisect good
git bisect start HEAD v2.1.0
git bisect run npm test
Workflow 4: Multi-Branch Development
cd ~/projects/myapp
git worktree add ../myapp-hotfix hotfix/critical-bug
cd ../myapp-hotfix
git commit -m "fix: resolve critical bug"
git push origin hotfix/critical-bug
cd ~/projects/myapp
git fetch origin
git cherry-pick hotfix/critical-bug
git worktree remove ../myapp-hotfix
Workflow 5: Recover from Mistakes
git reset --hard HEAD~5
git reflog
git reset --hard def456
git branch recovery def456
Advanced Techniques
Rebase vs Merge Strategy
When to Rebase:
- Cleaning up local commits before pushing
- Keeping feature branch up-to-date with main
- Creating linear history for easier review
When to Merge:
- Integrating completed features into main
- Preserving exact history of collaboration
- Public branches used by others
git checkout feature/my-feature
git fetch origin
git rebase origin/main
git status
git add .
git rebase --continue
git merge origin/main
Autosquash Workflow
Automatically squash fixup commits during rebase.
git commit -m "feat: add user authentication"
git commit --fixup HEAD
git commit --fixup abc123
git rebase -i --autosquash main
Split Commit
Break one commit into multiple logical commits.
git rebase -i HEAD~3
git reset HEAD^
git add file1.py
git commit -m "feat: add validation"
git add file2.py
git commit -m "feat: add error handling"
git rebase --continue
Partial Cherry-Pick
Cherry-pick only specific files from a commit.
git show --name-only abc123
git checkout abc123 -- path/to/file1.py path/to/file2.py
git commit -m "cherry-pick: apply specific changes from abc123"
Best Practices
- Always Use --force-with-lease: Safer than --force, prevents overwriting others' work
- Rebase Only Local Commits: Don't rebase commits that have been pushed and shared
- Descriptive Commit Messages: Future you will thank present you
- Atomic Commits: Each commit should be a single logical change
- Test Before Force Push: Ensure history rewrite didn't break anything
- Keep Reflog Aware: Remember reflog is your safety net for 90 days
- Branch Before Risky Operations: Create backup branch before complex rebases
git push --force-with-lease origin feature/branch
git branch backup-branch
git rebase -i main
git reset --hard backup-branch
Common Pitfalls
- Rebasing Public Branches: Causes history conflicts for collaborators
- Force Pushing Without Lease: Can overwrite teammate's work
- Losing Work in Rebase: Resolve conflicts carefully, test after rebase
- Forgetting Worktree Cleanup: Orphaned worktrees consume disk space
- Not Backing Up Before Experiment: Always create safety branch
- Bisect on Dirty Working Directory: Commit or stash before bisecting
Recovery Commands
git rebase --abort
git merge --abort
git cherry-pick --abort
git bisect reset
git restore --source=abc123 path/to/file
git reset --soft HEAD^
git reset --hard HEAD^
git reflog
git branch recovered-branch abc123
Resources
- references/git-rebase-guide.md: Deep dive into interactive rebase
- references/git-conflict-resolution.md: Advanced conflict resolution strategies
- references/git-history-rewriting.md: Safely rewriting Git history
- assets/git-workflow-checklist.md: Pre-PR cleanup checklist
- assets/git-aliases.md: Useful Git aliases for advanced workflows
- scripts/git-clean-branches.sh: Clean up merged and stale branches