mastering-git-cli
SKILL.md
Git CLI Skill (2025 Edition)
Production-ready Git workflows and automation for modern development.
Compatibility: Git 2.38+ recommended. Git 2.51+ for full SHA-256/Reftable support.
Triggers
This skill activates on:
gitcommands and version control questions- Merge conflicts, rebase operations, cherry-pick decisions
- Worktree setup and submodule management
- Branch strategy and repository troubleshooting
- Large repo optimization (Scalar, sparse checkout, blobless clones)
- CI/CD git integration and performance tuning
Quick Start
Most Common Patterns
# Clone and start working (use switch, not checkout)
git clone <url> && cd <repo>
git switch -c feature-x
# Commit workflow
git add -A && git commit -m "feat: description"
git push -u origin feature-x
# Merge feature to main
git switch main && git pull
git merge --no-ff feature-x
git push
# Large repo? Use partial clone
git clone --filter=blob:none <url>
Modern Git Config (2025 Defaults)
# Core workflow
git config --global pull.rebase true
git config --global push.autoSetupRemote true
git config --global merge.conflictStyle zdiff3
git config --global diff.algorithm histogram
git config --global rerere.enabled true
git config --global rebase.autoStash true
# Performance (essential for large repos)
git config --global core.fsmonitor true
git config --global fetch.prune true
git config --global feature.manyFiles true
# SSH signing (simpler than GPG)
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true
# Enable background maintenance
git maintenance start
Decision Trees
Merge vs Rebase vs Cherry-pick
Need to integrate changes?
│
├─ All commits from a branch?
│ ├─ Shared branch (pushed/collaborative) → MERGE
│ └─ Local-only branch → REBASE (cleaner) or MERGE
│
└─ Specific commits only?
└─ CHERRY-PICK
├─ Hotfix to release branch → cherry-pick -x
└─ Backport to old version → cherry-pick -x
⚠️ AVOID: Rebasing shared/pushed branches (rewrites history others depend on)
Worktrees vs Branches vs Stash
Need to switch context?
│
├─ Quick switch, will return soon → STASH
├─ Parallel work on same files → Not possible
├─ Parallel work on different features?
│ ├─ Short-lived (minutes) → STASH or COMMIT WIP
│ └─ Long-running or parallel builds → WORKTREE
│
└─ Multiple agents working simultaneously → WORKTREE (essential)
Submodules vs Subtree vs Monorepo
External code dependency?
│
├─ Need to modify and contribute back → SUBMODULE
├─ Just embedding, no upstream → SUBTREE
├─ Tight coupling, single team → MONOREPO
└─ Standard library/package → PACKAGE MANAGER
Reset vs Revert vs Restore
Undo something?
│
├─ Discard file changes (not staged) → git restore <file>
├─ Unstage files → git restore --staged <file>
├─ Undo commits (not pushed)?
│ ├─ Keep changes staged → git reset --soft HEAD~1
│ ├─ Keep changes unstaged → git reset HEAD~1
│ └─ Discard everything → git reset --hard HEAD~1
│
└─ Undo commits (already pushed) → git revert <sha>
Clone Strategy (Large Repos)
How to clone?
│
├─ Small repo (<500MB) → Full clone (default)
├─ Large repo, developer workstation
│ └─ BLOBLESS clone → git clone --filter=blob:none <url>
├─ Large repo, CI build
│ ├─ Need only HEAD → SHALLOW → git clone --depth 1
│ └─ Need history → TREELESS → git clone --filter=tree:0
│
└─ Monorepo, specific directories only
└─ SCALAR + SPARSE → scalar clone <url>, then sparse-checkout
⚠️ AVOID: Shallow clone for development (breaks blame, log, push)
checkout vs switch/restore
Which command?
│
├─ Changing branches → git switch <branch>
├─ Creating branch → git switch -c <new-branch>
├─ Discarding file changes → git restore <file>
├─ Unstaging files → git restore --staged <file>
│
└─ git checkout → Legacy (avoid in new scripts)
Merge Easy Buttons
Integrate feature into main
git checkout main
git merge --no-ff feature # Always creates merge commit
Update feature with latest main
git checkout feature
git merge main # Safe for shared branches
# OR
git rebase main # Only if branch not shared
Resolve all conflicts using theirs
git checkout --theirs .
git add .
git commit
Resolve all conflicts using ours
git checkout --ours .
git add .
git commit
Abort a broken merge
git merge --abort
Undo a pushed merge
git revert -m 1 <merge-sha>
git push
Merge multiple branches at once
git merge feature-a feature-b feature-c # Octopus merge (no conflicts allowed)
Script Usage
Agent Worktree Setup
Create isolated worktrees for parallel agent development:
scripts/setup-agent-worktrees.sh [num_agents] [base_branch]
# Example: scripts/setup-agent-worktrees.sh 3 main
# Creates: ../agent-1, ../agent-2, ../agent-3, ../integration
# Output: "Created 3 agent worktrees from main"
Use case: Running 3 Claude agents in parallel on different features, each with isolated working directories.
Agent Worktree Cleanup
Remove all agent worktrees and optionally delete branches:
scripts/cleanup-agent-worktrees.sh [--delete-branches] [--force]
# Example: scripts/cleanup-agent-worktrees.sh --delete-branches
# Removes worktrees and their associated branches
Submodule Status Report
Get readable status of all submodules:
scripts/submodule-report.sh
# Output: Table showing submodule path, branch, commit, and sync status
Git Health Check
Diagnose common repository issues:
scripts/git-health-check.sh [--verbose]
# Checks: dangling objects, broken refs, large files, stale branches
Reference Navigation
Read the appropriate reference file based on your task:
| Task | Reference File |
|---|---|
| Understand Git internals, object model, DAG | references/foundations.md |
| Configure Git, set up 2025 defaults | references/foundations.md |
| Clone, commit, log, branch basics | references/daily-usage.md |
| Create/manage worktrees | references/worktrees.md |
| Set up parallel agent workflows | references/worktrees.md |
| Choose merge strategy | references/merge-operations.md |
| Resolve merge conflicts | references/merge-operations.md |
| Use rerere for conflict resolution | references/merge-operations.md |
| Add/update/manage submodules | references/submodules.md |
| Multi-repo project architecture | references/submodules.md |
| Reset, revert, restore operations | references/advanced-operations.md |
| Interactive rebase, squashing | references/advanced-operations.md |
| Stashing, tags, hooks | references/advanced-operations.md |
| Recover lost commits/branches | references/recovery.md |
| Troubleshoot common errors | references/recovery.md |
| Command cheat sheet | references/recovery.md |
| SHA-256, Reftable, SSH signing | references/git-2025-features.md |
| git switch/restore, range-diff | references/git-2025-features.md |
| Git maintenance, bisect run | references/git-2025-features.md |
| Merge queues, pre-commit framework | references/git-2025-features.md |
| Partial/blobless clones, Scalar | references/large-repos.md |
| Sparse checkout for monorepos | references/large-repos.md |
| Bare repo + worktree layout | references/large-repos.md |
| CI/CD Git optimization | references/large-repos.md |
Critical Knowledge
The -X ours vs -s ours Trap
# -X ours: Prefer our changes ONLY IN CONFLICTS
git merge -X ours feature
# ↑ Merges all non-conflicting changes from feature
# -s ours: IGNORE EVERYTHING from other branch
git merge -s ours feature
# ↑ Keeps our tree exactly, just records the merge
Conflict Style Recommendation
git config --global merge.conflictStyle zdiff3
Shows base version in conflicts, making resolution clearer:
<<<<<<< HEAD
our version
||||||| merged common ancestor
original version
=======
their version
>>>>>>> feature
Branch Can Only Exist in One Worktree
A branch can only be checked out in ONE worktree. To work on it elsewhere:
git worktree add -b feature-copy ../feature-copy feature # Create copy
Submodules Default to Detached HEAD
After git submodule update, always checkout a branch before making changes:
cd submodule-dir
git checkout main # Then make changes
2025 Easy Buttons
Find the bug-introducing commit automatically
# Create test script: exit 0 = good, exit 1 = bad
echo '#!/bin/bash
npm test -- --grep="broken feature"' > test.sh
chmod +x test.sh
git bisect start HEAD v1.0.0
git bisect run ./test.sh
git bisect reset
Compare rebased PR (what actually changed)
git range-diff main..feature@{1} main..feature
Monorepo: checkout only what you need
git clone --filter=blob:none <url>
cd repo
git sparse-checkout init --cone
git sparse-checkout set backend/api frontend/app
Set up performance optimization
scalar register # Enable all optimizations
# OR manually:
git maintenance start # Background maintenance
git config core.fsmonitor true # Filesystem watcher
SSH signing setup (simpler than GPG)
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true
Migrate to reftable (10K+ branches)
git refs migrate --ref-format=reftable
Anti-Patterns (Avoid These)
Don't use checkout for file operations
# Bad: ambiguous, can lose data
git checkout file.txt
# Good: explicit intent
git restore file.txt
Don't shallow clone for development
# Bad: breaks blame, log, push
git clone --depth 1 <url>
# Good: blobless preserves history
git clone --filter=blob:none <url>
Don't skip --force-with-lease
# Bad: can overwrite teammates' work
git push --force
# Good: fails if remote has new commits
git push --force-with-lease
Don't run git gc manually
# Bad: blocks, runs everything at once
git gc
# Good: scheduled, incremental
git maintenance start
Don't rebase shared branches
# Bad: rewrites history others depend on
git rebase main # on a pushed branch
# Good: merge instead for shared branches
git merge main
Don't commit secrets or generated files
# Bad: committing sensitive or generated files
git add .env node_modules/
# Good: ensure .gitignore is set first
echo -e ".env\nnode_modules/" >> .gitignore
git add .gitignore
Don't ignore merge conflicts
# Bad: accepting all changes blindly
git checkout --theirs . # without reviewing
# Good: review each conflict
git mergetool # or manual review with zdiff3
Weekly Installs
3
First Seen
9 days ago
Security Audits
Installed on
opencode2
gemini-cli2
replit2
junie2
windsurf2
claude-code2