Git workflow patterns for commits, branching, PRs, and history management across heterogeneous repositories. Use when creating commits, managing branches, opening pull requests, or rewriting history. Do not use for non-git implementation tasks or repo-specific release policy decisions without repository documentation.
95
Quality
96%
Does it follow best practices?
Impact
90%
1.50xAverage score across 3 eval scenarios
Passed
No known issues
When this skill is loaded, follow these directives for all git operations:
type(scope): description format--force-with-lease for force pushes; confirm with the user before any force pushFollow this sequence when performing git operations:
git status and git diff HEAD; output: working tree and unstaged/staged deltagit add path/to/file for each file; verify with git statustype(scope): description with optional bodygit push --force-with-lease origin {branch} only for rewritten history and only after user confirmationAgents may create WIP checkpoint commits during long-running tasks. These are development artifacts, cleaned up before PR.
wip: or use standard conventional commit format/rewrite-history before opening a PR to craft a clean narrativegit add src/auth.ts src/auth.test.tsgit status before committing.env files, credentials, and large binaries out of commits — warn the user if staged files look sensitiveUse --force-with-lease exclusively to protect against overwriting upstream changes:
git push --force-with-lease origin feat/my-branchAlways confirm with the user before any force push, regardless of branch.
Format: type(scope): description
Subject line rules:
Common types:
| Type | Use for |
|---|---|
feat | New functionality |
fix | Bug fix |
docs | Documentation only |
refactor | Restructuring without behavior change |
perf | Performance improvement |
chore | Maintenance, dependencies, tooling |
test | Adding or updating tests |
ci | CI/CD pipeline changes |
build | Build system changes |
style | Formatting, whitespace (no logic change) |
Body is optional — only add one when the change is genuinely non-obvious. The subject line carries the "what"; the body explains "why."
Add a body when:
fix(shell): restore Alt+F terminal navigationfix(shell): use HOMEBREW_PREFIX to avoid path_helper breaking plugins in login shells
macOS path_helper reorders PATH in login shells, putting /usr/local/bin
before /opt/homebrew/bin. This caused `brew --prefix` to resolve the stale
Intel Homebrew, so fzf, zsh-autosuggestions, and zsh-syntax-highlighting
all silently failed to load in Ghostty (which spawns login shells).
Use the HOMEBREW_PREFIX env var (set by brew shellenv in .zshenv) instead
of calling `brew --prefix` — it survives path_helper and is faster.feat(install): add claude bootstrap runtime management
- migrate Claude defaults to declarative files under claude/defaults
- add claude-bootstrap check/fix/uninstall with backup-first migration
- stop stowing full claude/codex runtime trees and tighten drift checksfix(pool-party): handle stale settlement state on reconnect
PoolSettlement contract stays in pending state when the participant
disconnects mid-settlement. Check settlement timestamp and expire
stale entries on reconnect.
Fixes SEND-718chore(submodule): update claude-code
Bump claude-code to 88d0c75 (feat(skills): add tiltup, specalign, and e2e skills).For trivial bumps, bump or bump claude-code submodule is acceptable.
</example>
refactor(api)!: change auth endpoint response format
The /auth/token endpoint now returns { access_token, expires_in }
instead of { token, expiry }. All clients must update their parsers.Before branching or opening a PR, discover the repo's branch topology. Run these commands and store the results:
# Default branch (PR target for most repos)
gh repo view --json defaultBranchRef --jq '.defaultBranchRef.name'
# Current branch
git branch --show-current
# Production branch (if different from default)
git branch -r --list 'origin/main' 'origin/master' 'origin/production'Fallback when gh is unavailable or the repo has no remote:
# Infer default branch from local refs
git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@'
# Last resort: check local branches and fail loudly if unknown
if git rev-parse --verify main >/dev/null 2>&1; then
echo main
elif git rev-parse --verify master >/dev/null 2>&1; then
echo master
else
echo "ERROR: unable to determine default branch (main/master not found)." >&2
exit 1
fiStore the discovered branch name and reference it throughout. Use the actual branch name in all subsequent commands.
Use repository branch naming conventions first. If no convention is documented, use:
Format: type/description-TICKET-ID
Examples:
feat/add-login-SEND-77fix/pool-party-stall-SEN-68chore/update-depshotfix/auth-bypassInclude the ticket ID when an issue exists. Omit when there is no ticket.
Use repository branch flow policy first. If policy is undocumented, a common baseline is:
{production-branch} (production deploys)
└── {default-branch} (staging/testnet deploys, PR target)
├── feat/add-feature-TICKET
├── fix/bug-description-TICKET
└── hotfix/* (branches off production branch for hotfixes)Use repository merge policy first (required in many organizations).
If no policy exists, these defaults are reasonable:
| PR target | Strategy | Rationale |
|---|---|---|
| Feature → default branch | Squash merge | Clean history, one commit per feature |
| Default → production | Merge commit | Preserves the release boundary; visible deploy points |
| Hotfix → production | Squash merge | Single atomic fix on production |
Pragmatic sizing over arbitrary limits. Each commit tells a clear story regardless of PR size. A PR should be reviewable as a coherent unit — if a reviewer cannot hold the full change in their head, consider splitting.
Use repo-native PR tooling (gh pr create, GitLab CLI, or web UI) with:
For branches with messy WIP history, use /rewrite-history to:
Each rewritten commit introduces one coherent idea, building on the previous — like a tutorial teaching the reader how the feature was built.
5342bca
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.