git-advanced-workflows

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.

View Source
name:git-advanced-workflowsdescription: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.

Do not use this skill when

  • The task is unrelated to git advanced workflows

  • You need a different domain or tool outside this scope
  • Instructions

  • Clarify goals, constraints, and required inputs.

  • Apply relevant best practices and validate outcomes.

  • Provide actionable steps and verification.

  • If detailed examples are required, open resources/implementation-playbook.md.
  • Use this skill when

  • 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:

    # Rebase last 5 commits
    git rebase -i HEAD~5

    Rebase all commits on current branch


    git rebase -i $(git merge-base HEAD main)

    Rebase onto specific commit


    git rebase -i abc123

    2. Cherry-Picking

    Apply specific commits from one branch to another without merging entire branches.

    # Cherry-pick single commit
    git cherry-pick abc123

    Cherry-pick range of commits (exclusive start)


    git cherry-pick abc123..def456

    Cherry-pick without committing (stage changes only)


    git cherry-pick -n abc123

    Cherry-pick and edit commit message


    git cherry-pick -e abc123

    3. Git Bisect

    Binary search through commit history to find the commit that introduced a bug.

    # Start bisect
    git bisect start

    Mark current commit as bad


    git bisect bad

    Mark known good commit


    git bisect good v1.0.0

    Git will checkout middle commit - test it


    Then mark as good or bad


    git bisect good # or: git bisect bad

    Continue until bug found


    When done


    git bisect reset

    Automated Bisect:

    # Use script to test automatically
    git bisect start HEAD v1.0.0
    git bisect run ./test.sh

    test.sh should exit 0 for good, 1-127 (except 125) for bad

    4. Worktrees

    Work on multiple branches simultaneously without stashing or switching.

    # List existing worktrees
    git worktree list

    Add new worktree for feature branch


    git worktree add ../project-feature feature/new-feature

    Add worktree and create new branch


    git worktree add -b bugfix/urgent ../project-hotfix main

    Remove worktree


    git worktree remove ../project-feature

    Prune stale worktrees


    git worktree prune

    5. Reflog

    Your safety net - tracks all ref movements, even deleted commits.

    # View reflog
    git reflog

    View reflog for specific branch


    git reflog show feature/branch

    Restore deleted commit


    git reflog

    Find commit hash


    git checkout abc123
    git branch recovered-branch

    Restore deleted branch


    git reflog
    git branch deleted-branch abc123

    Practical Workflows

    Workflow 1: Clean Up Feature Branch Before PR

    # Start with feature branch
    git checkout feature/user-auth

    Interactive rebase to clean history


    git rebase -i main

    Example rebase operations:


    - Squash "fix typo" commits


    - Reword commit messages for clarity


    - Reorder commits logically


    - Drop unnecessary commits

    Force push cleaned branch (safe if no one else is using it)


    git push --force-with-lease origin feature/user-auth

    Workflow 2: Apply Hotfix to Multiple Releases

    # Create fix on main
    git checkout main
    git commit -m "fix: critical security patch"

    Apply to release branches


    git checkout release/2.0
    git cherry-pick abc123

    git checkout release/1.9
    git cherry-pick abc123

    Handle conflicts if they arise


    git cherry-pick --continue

    or


    git cherry-pick --abort

    Workflow 3: Find Bug Introduction

    # Start bisect
    git bisect start
    git bisect bad HEAD
    git bisect good v2.1.0

    Git checks out middle commit - run tests


    npm test

    If tests fail


    git bisect bad

    If tests pass


    git bisect good

    Git will automatically checkout next commit to test


    Repeat until bug found

    Automated version


    git bisect start HEAD v2.1.0
    git bisect run npm test

    Workflow 4: Multi-Branch Development

    # Main project directory
    cd ~/projects/myapp

    Create worktree for urgent bugfix


    git worktree add ../myapp-hotfix hotfix/critical-bug

    Work on hotfix in separate directory


    cd ../myapp-hotfix

    Make changes, commit


    git commit -m "fix: resolve critical bug"
    git push origin hotfix/critical-bug

    Return to main work without interruption


    cd ~/projects/myapp
    git fetch origin
    git cherry-pick hotfix/critical-bug

    Clean up when done


    git worktree remove ../myapp-hotfix

    Workflow 5: Recover from Mistakes

    # Accidentally reset to wrong commit
    git reset --hard HEAD~5 # Oh no!

    Use reflog to find lost commits


    git reflog

    Output shows:


    abc123 HEAD@{0}: reset: moving to HEAD~5


    def456 HEAD@{1}: commit: my important changes

    Recover lost commits


    git reset --hard def456

    Or create branch from lost commit


    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
  • # Update feature branch with main changes (rebase)
    git checkout feature/my-feature
    git fetch origin
    git rebase origin/main

    Handle conflicts


    git status

    Fix conflicts in files


    git add .
    git rebase --continue

    Or merge instead


    git merge origin/main

    Autosquash Workflow

    Automatically squash fixup commits during rebase.

    # Make initial commit
    git commit -m "feat: add user authentication"

    Later, fix something in that commit


    Stage changes


    git commit --fixup HEAD # or specify commit hash

    Make more changes


    git commit --fixup abc123

    Rebase with autosquash


    git rebase -i --autosquash main

    Git automatically marks fixup commits

    Split Commit

    Break one commit into multiple logical commits.

    # Start interactive rebase
    git rebase -i HEAD~3

    Mark commit to split with 'edit'


    Git will stop at that commit

    Reset commit but keep changes


    git reset HEAD^

    Stage and commit in logical chunks


    git add file1.py
    git commit -m "feat: add validation"

    git add file2.py
    git commit -m "feat: add error handling"

    Continue rebase


    git rebase --continue

    Partial Cherry-Pick

    Cherry-pick only specific files from a commit.

    # Show files in commit
    git show --name-only abc123

    Checkout specific files from commit


    git checkout abc123 -- path/to/file1.py path/to/file2.py

    Stage and commit


    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
  • # Safe force push
    git push --force-with-lease origin feature/branch

    Create backup before risky operation


    git branch backup-branch
    git rebase -i main

    If something goes wrong


    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

    # Abort operations in progress
    git rebase --abort
    git merge --abort
    git cherry-pick --abort
    git bisect reset

    Restore file to version from specific commit


    git restore --source=abc123 path/to/file

    Undo last commit but keep changes


    git reset --soft HEAD^

    Undo last commit and discard changes


    git reset --hard HEAD^

    Recover deleted branch (within 90 days)


    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