Loading...
Loading...
Git branching strategies, conflict resolution, rebase workflows, monorepo patterns, and advanced operations like cherry-pick, bisect, and reflog recovery. Activate on "git", "branching strategy", "merge conflict", "rebase", "cherry-pick", "monorepo git", "git bisect", "git reflog", "squash commits". NOT for GitHub Actions CI/CD (use github-actions-pipeline-builder), GitHub API/webhooks, or PR review processes (use code-review-checklist).
npx skill4agent add erichowens/some_claude_skills git-workflow-expertgithub-actions-pipeline-buildercode-review-checklistflowchart TD
Start[New project or rethinking strategy?] --> Team{Team size?}
Team -->|Solo or 2-3| Trunk[Trunk-Based Development]
Team -->|4-15| GHFlow[GitHub Flow]
Team -->|15+ or regulated| Q2{Release cadence?}
Q2 -->|Continuous deploy| GHFlow
Q2 -->|Scheduled releases| GitFlow[Git-Flow]
Q2 -->|Multiple supported versions| GitFlow
Trunk --> T1[Main branch only]
T1 --> T2[Short-lived feature branches < 1 day]
T2 --> T3[Feature flags for incomplete work]
GHFlow --> G1[main + feature branches]
G1 --> G2[PR-based review]
G2 --> G3[Deploy from main after merge]
GitFlow --> GF1[main + develop + feature + release + hotfix]
GF1 --> GF2[Formal release branches]
GF2 --> GF3[Hotfix branches from main]| Dimension | Trunk-Based | GitHub Flow | Git-Flow |
|---|---|---|---|
| Branch lifetime | Hours | Days | Days-weeks |
| Merge frequency | Multiple/day | Daily | Per-sprint |
| CI requirement | Mandatory | Strong | Optional |
| Rollback mechanism | Feature flags | Revert commit | Release branch |
| Best for | High-trust teams | Most web projects | Versioned releases |
| Worst for | Junior-heavy teams | Multiple live versions | Fast iteration |
flowchart TD
Q[Integrating changes?] --> Shared{Is the branch shared?}
Shared -->|Yes, others push to it| Merge[Use merge]
Shared -->|No, only me| Q2{Want clean history?}
Q2 -->|Yes| Rebase[Use rebase]
Q2 -->|No, preserve context| Merge
Rebase --> Q3{Long-lived branch?}
Q3 -->|Yes, many conflicts expected| RebaseOnto[Consider rebase --onto]
Q3 -->|No| RebaseSimple[Simple rebase]mergerebasegit rebase main# 1. Before resolving: understand what happened
git log --merge --oneline # Show conflicting commits
git diff --name-only --diff-filter=U # List conflicted files
# 2. For each file: understand both sides
git diff :2:file :3:file # :2 = ours, :3 = theirs
# 3. Resolve, then verify
git add resolved-file.ts
git diff --cached # Review what you're about to commit
# 4. After all files resolved
git merge --continue # or git rebase --continuegit checkout --ours .git mergetoolrerere# Pick a specific commit from another branch
git cherry-pick abc123
# Pick a range (exclusive start, inclusive end)
git cherry-pick abc123..def456
# Cherry-pick without committing (stage only)
git cherry-pick --no-commit abc123
# If conflicts: resolve then
git cherry-pick --continue# Start bisect
git bisect start
git bisect bad # Current commit is broken
git bisect good v1.2.0 # This tag was working
# Git checks out a middle commit. Test it, then:
git bisect good # or: git bisect bad
# Repeat until git identifies the first bad commit
# Automated bisect with a test script:
git bisect start HEAD v1.2.0
git bisect run npm test # Runs test at each step automatically# See recent HEAD positions
git reflog --oneline -20
# Recover a dropped stash
git stash list # Empty? Check reflog:
git fsck --no-reflogs | grep commit # Find dangling commits
git show <sha> # Inspect to find your stash
# Undo a bad rebase
git reflog
# Find the SHA before the rebase started
git reset --hard HEAD@{5} # Reset to that point
# Recover deleted branch
git reflog | grep "branch-name"
git checkout -b recovered-branch <sha># Rewrite last 5 commits
git rebase -i HEAD~5
# In the editor:
# pick abc123 Add user model ← keep as-is
# squash def456 Fix typo in user model ← squash into previous
# reword ghi789 Add auth ← edit commit message
# drop jkl012 WIP debugging ← remove entirely
# edit mno345 Add migration ← pause to amend
# Autosquash: commits prefixed with "fixup!" or "squash!" auto-arrange
git commit --fixup abc123 # Creates "fixup! Add user model"
git rebase -i --autosquash HEAD~5 # Automatically squashes it# Enable sparse checkout
git sparse-checkout init --cone
git sparse-checkout set packages/core packages/cli
# Now only packages/core and packages/cli are checked out
# Other directories exist in git but aren't on disk# Add a subtree
git subtree add --prefix=libs/shared https://github.com/org/shared.git main --squash
# Pull updates
git subtree pull --prefix=libs/shared https://github.com/org/shared.git main --squash
# Push changes back upstream
git subtree push --prefix=libs/shared https://github.com/org/shared.git feature-x| Dimension | Submodules | Subtree |
|---|---|---|
| Model | Pointer to external repo | Copy of external repo |
| Clone | Requires | Just works |
| Update | | |
| CI complexity | Higher (need init step) | Lower |
| Best for | Large vendored deps | Small shared libs |
| Footgun risk | High (detached HEAD trap) | Low |
# .git/hooks/pre-commit (or use husky/lefthook)
#!/bin/sh
# Run linter on staged files only
npx lint-staged
# .git/hooks/commit-msg
#!/bin/sh
# Enforce conventional commits
if ! grep -qE "^(feat|fix|docs|style|refactor|test|chore)(\(.+\))?: .+" "$1"; then
echo "Commit message must follow Conventional Commits format"
exit 1
fi
# .git/hooks/pre-push
#!/bin/sh
# Run tests before push
npm test || exit 1--no-verify--no-verifyhasMultipleVersions: trueisLibrary: truerelease/vN.xisRegulated: trueciMaturity: 'low'| From | To | Steps |
|---|---|---|
| git-flow → trunk-based | 1. Merge | |
| git-flow → github-flow | 1. Merge | |
| github-flow → trunk-based | 1. Reduce PR size to <200 lines. 2. Add comprehensive CI. 3. Allow direct push to |
# NEVER force push to main/master
# Use --force-with-lease instead of --force
git push --force-with-lease origin feature-branch
# --force-with-lease checks that remote hasn't been updated
# since your last fetch. Prevents overwriting others' work.
# Set as default (never use bare --force again):
git config --global alias.pushf "push --force-with-lease"references/advanced-rebase-patterns.mdreferences/monorepo-git-strategies.md