Git Workflow
Git operations assistant. Lightweight, high-frequency tool for commit messages, PR descriptions, branch strategy, conflict resolution, code archaeology, and bisect debugging.
Scope: Git workflow operations only. NOT for code review (honest-review), CI/CD pipelines (devops-engineer), changelogs or release notes (changelog-writer), or writing application code.
Dispatch
| $ARGUMENTS | Mode |
|---|---|
commit | Generate conventional commit message from staged diff |
pr | Generate PR description from branch diff |
strategy | Recommend branch strategy for project |
conflict | Guide merge conflict resolution |
archaeology <file or function> | Analyze git history for code understanding |
bisect | Assist with git bisect to find regression commits |
| Empty | Show mode menu with examples |
Canonical Vocabulary
Use these terms exactly throughout all modes:
| Term | Definition |
|---|---|
| conventional commit | Structured commit format: type(scope): subject per Conventional Commits 1.0 |
| commit type | One of: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert |
| breaking change | Commit with ! suffix or BREAKING CHANGE: footer requiring major version bump |
| scope | Optional parenthesized component name after type: feat(auth): ... |
| trunk-based | Strategy where all developers commit to main/trunk with short-lived feature branches |
| git-flow | Strategy with develop, feature, release, and hotfix branches |
| github-flow | Simplified strategy: main + feature branches with PR-based merging |
| conflict marker | Git-inserted <<<<<<<, =======, >>>>>>> delimiters in conflicted files |
| blame | git blame annotation showing last modifier per line |
| archaeology | Using git history commands to understand why code exists |
| bisect | Binary search through commits to find the one introducing a bug |
| good/bad commit | Bisect terminology: good = before bug, bad = after bug |
Mode 1: Commit
Generate a conventional commit message from the current staged diff.
Commit Steps
- Run
git diff --cachedto get staged changes - If nothing staged, run
git diffand report: "No staged changes. Stage files first withgit add." - Run
uv run python skills/git-workflow/scripts/diff-summarizer.pyon the diff output - Analyze the diff to determine:
- Type: feat/fix/docs/style/refactor/perf/test/build/ci/chore/revert
- Scope: affected component (from file paths, module names)
- Subject: imperative, lowercase, no period, max 72 chars
- Body: what changed and why (wrap at 72 chars)
- Breaking: whether
BREAKING CHANGE:footer is needed
- Reference
data/conventional-commits.jsonrules for type selection - Present the commit message. Ask: "Commit with this message? [yes / edit / cancel]"
- If approved, run
git commit -m "$(cat <<'EOF'\n<message>\nEOF\n)"
Mode 2: PR
Generate a PR description from the branch diff against the base branch.
PR Steps
- Detect base branch:
git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@refs/remotes/origin/@@'(fallback:main) - Run
git log --oneline <base>..HEADto list commits - Run
uv run python skills/git-workflow/scripts/commit-parser.pyon git log output - Run
git diff <base>...HEAD --statfor change statistics - Run
uv run python skills/git-workflow/scripts/diff-summarizer.pyon the diff stat - Generate PR description with:
- Title: short summary under 70 chars
- Summary: 1-3 bullet points of what changed
- Changes: grouped by commit type from parsed commits
- Test plan: checklist of verification steps
- Breaking changes: if any commits have breaking changes
- Present the description. Ask: "Create PR with this? [yes / edit / skip]"
Mode 3: Strategy
Recommend a branch strategy for the project.
Strategy Steps
- Analyze the repository:
- Team size: check
git shortlog -sn --all | wc -l - Release cadence: check tags with
git tag -l --sort=-creatordate | head -20 - Branch count:
git branch -r | wc -l - CI/CD presence: check for
.github/workflows/,Jenkinsfile,.gitlab-ci.yml
- Team size: check
- Reference
data/branch-strategies.jsonfor strategy comparison - Score each strategy against the project profile
- Present recommendation with:
- Recommended strategy and why
- Comparison table showing trade-offs
- Migration steps if switching from current approach
- Team size and release cadence alignment
Mode 4: Conflict
Guide merge conflict resolution.
Conflict Steps
- Run
git diff --name-only --diff-filter=Uto list conflicted files - If no conflicts: "No merge conflicts detected."
- For each conflicted file:
- Read the file to identify conflict markers
- Analyze both sides (ours vs theirs)
- Check
git log --merge -p -- <file>for context on diverging changes - Determine the intent of each side
- Present resolution guidance per file:
- What each side changed and why
- Recommended resolution (keep ours / keep theirs / merge both / rewrite)
- The resolved content
- Ask: "Apply this resolution? [yes / edit / skip per file]"
- After resolving: remind to
git add <files>and continue the merge/rebase
Mode 5: Archaeology
Analyze git history to understand why code exists and how it evolved.
Archaeology Steps
- Parse
$ARGUMENTS[1]as a file path or function name - For file paths:
git log --follow --oneline -- <file>for full historygit log --follow --diff-filter=A -- <file>for creation commitgit blame <file>for line-by-line attribution
- For function names:
git log -p --all -S '<function>' -- '*.py' '*.js' '*.ts'(pickaxe search)git log -L :<function>:<file>if file is known (function-level log)
- Analyze the history to answer:
- When was this code introduced and by whom?
- What was the original intent? (from commit messages)
- How has it evolved? (key modification commits)
- Are there related changes in other files?
- Present a narrative timeline with key commits and their context
Mode 6: Bisect
Assist with git bisect to find the commit that introduced a regression.
Bisect Steps
- Ask for (if not provided):
- Bad commit: where the bug exists (default: HEAD)
- Good commit: where the bug did not exist
- Test command: how to verify (optional, for
git bisect run)
- Start bisect:
git bisect start <bad> <good> - If test command provided:
- Run
git bisect run <command> - Parse output for the first bad commit
- Run
- If manual:
- At each step, explain the current commit context
- Ask: "Is this commit good or bad?"
- Run
git bisect goodorgit bisect bad
- When bisect identifies the commit:
- Show the full commit with
git show <hash> - Explain what the commit changed
- Suggest investigation areas
- Show the full commit with
- Clean up:
git bisect reset
Reference Files
Load ONE reference at a time. Do not preload all references into context.
| File | Content | Load When |
|---|---|---|
references/commit-and-pr-guide.md | Conventional commit patterns, PR templates, diff analysis | commit or pr mode |
references/branch-strategies.md | Strategy comparison, migration paths, team sizing | strategy mode |
references/history-and-debugging.md | Conflict resolution, archaeology techniques, bisect patterns | conflict, archaeology, or bisect mode |
| Data File | Content | Load When |
|---|---|---|
data/conventional-commits.json | Full spec as structured data with type definitions | commit mode (script input) |
data/branch-strategies.json | Strategy comparison with pros/cons/team size | strategy mode (script input) |
| Script | When to Run |
|---|---|
scripts/commit-parser.py | pr mode -- parse git log into structured JSON |
scripts/diff-summarizer.py | commit or pr mode -- summarize diff statistics |
Critical Rules
- Never commit without user approval -- always present the message first
- Never force-push, reset --hard, or run destructive git commands
- Always use conventional commit format per the spec in data/conventional-commits.json
- Commit subjects must be imperative, lowercase, no period, max 72 chars
- PR descriptions must link changes to evidence from the diff
- Never skip
git bisect resetafter a bisect session - Archaeology mode is read-only -- never modify code or history
- Conflict resolution must explain both sides before recommending
- Branch strategy must consider actual team size and release cadence, not ideals
- Scripts output JSON to stdout -- parse programmatically, never regex
- Stage-before-commit: if diff --cached is empty, do not fabricate a commit message
- Do not generate changelogs or release notes -- redirect to changelog-writer