Git Workflow
Use for Git operations that affect history, branches, tags, commits, or conflict recovery. Use github-workflow for GitHub PRs, reviews, Actions, Releases, and gh CLI workflows.
Core Rules
- Inspect repository-specific Git guidance first:
AGENTS.md,CLAUDE.md,docs/git-workflow.md,CONTRIBUTING.md,README.md, release docs. - Never claim a check passed unless you ran it and can report the command.
- Avoid direct pushes to protected or shared base branches unless repo guidance and the user explicitly allow it.
- Keep commits atomic: one logical change per commit, no final
WIP,fixup, or mixed-change commits. - Use signed commits with DCO sign-off by default:
git commit -S --signoff. Plaingit commit -m ...orgit commit --amend -m ...is forbidden unless the user explicitly overrides signing or DCO. If signing is unavailable — a key probe finds no usable key, or a-Scommit just failed with a signing error, regardless ofcommit.gpgsign— do not retry; follow the signing fallback table inreferences/commits.md. - Never bypass hooks, signing, or DCO checks (
--no-verify,--no-gpg-sign) unless the user explicitly asks. - Use
--force-with-lease, never plain--force, and only after confirming the branch is safe to rewrite. - Ask before any command that may discard work, delete local or remote refs, or rewrite public/shared history:
git reset --hard, branch or tag deletion, force pushes, or discarding local changes. - Before running a commit, amend, or destructive command, construct the exact command and verify it keeps the safeguards above.
Before Acting
- Run
git status --shortbefore staging, committing, rebasing, merging, or deleting anything. - Document and reason about plain
gitcommands only. Command wrappers (token-filtering proxies such asrtk) are an execution-time concern: apply a wrapper prefix only when the user's global or repository guidance says so. All rules in this skill apply to the underlying Git command whether or not a wrapper prefix is present. - When inspecting diffs, use raw unified diffs. Do not use aliases or wrapped diff shortcuts such as
git difft; bypass pagers, colors, and external diff tools:
git --no-pager diff --no-color --no-ext-diff
git --no-pager diff --cached --no-color --no-ext-diff
git --no-pager show --no-color --no-ext-diff
- If a wrapper filters or hides diff output you need, rerun the same safe command through the wrapper's raw passthrough mode (for example
rtk proxy git --no-pager diff --no-color --no-ext-diff) or without the wrapper. - Identify the actual base branch from repo docs or remote metadata. Do not assume
main. - Refresh remote-tracking refs before operations whose correctness depends on remote state: merging into a base branch, rebasing onto it, release range review, or branch cleanup.
- Check whether the branch is shared before rebasing or force-pushing.
- Stage only intentional changes. Prefer
git add -por explicit file paths. - When creating or renaming local task branches, default to
feature/,fix/,hotfix/,docs/,test/,refactor/,release/, orchore/based on the work type unless the user supplies an exact branch name.
Commit Safety Checklist
Before any user-requested commit or amend:
- If the tree has multiple changed files or unclear scope, inspect
git --no-pager diff --no-color --no-ext-diff --stat,git --no-pager diff --no-color --no-ext-diff --name-status, and targeted diffs as needed. - Group changes by logical intent before staging; do not infer intent from paths alone when the diff suggests otherwise.
- Stage only the logical group directly covered by the user's current request unless the user explicitly asks to commit all remaining groups.
- Leave unrelated or unverified groups dirty and report them as follow-up commit candidates.
- Use
git add -Aonly when the intended commit scope is the whole tree and that scope has been verified. - Check staged files or staged diff before committing.
- Use Conventional Commits unless the repository documents another convention.
- Write a commit body unless the title is fully self-explanatory. Decide this explicitly rather than defaulting to a title-only commit: a fix, a workaround, a rejected alternative, a behavior or interface change, or anything a future
git blamereader would ask "why" about needs a body. Seereferences/commits.mdfor what belongs in one. - Resolve the subject-description language, and the body language separately when a body is needed, using
references/commits.md. - Verify the exact commit command against Core Rule 5 (
-S --signoff) before executing, and against the body decision above. Pass a body with-F -, not by cramming it into-m.
Branch and History Safety Checklist
Before creating, switching, rebasing, merging, force-pushing, or deleting branches:
- Confirm current branch, intended target branch, and actual base branch.
- Fetch and compare the base branch with its upstream before integrating or judging merged state.
- Check for uncommitted or staged changes that could be carried across branches.
- Confirm whether the branch is shared or protected before rewriting or deleting it, then apply Core Rules 7-8.
Reference Routing
| Reference | Use For |
|---|---|
references/branching.md |
Branch flow, trunk-based, GitFlow, release branches, branch naming |
references/linear-history.md |
Fast-forward vs rebase decisions, linear integration, conflict preflight |
references/commits.md |
Conventional Commits, commit bodies, message language, atomic commits, signed commits, DCO sign-off, staging, interactive rebase/autosquash cleanup |
references/conflicts-recovery.md |
Pull/merge/rebase/cherry-pick/stash conflicts, abort/continue flows, revert/reset/reflog recovery, untracking accidentally committed files |
references/releases.md |
Git tags, forge-neutral release notes, release branch safety |
references/anti-patterns.md |
Common Git mistakes before staging, committing, pushing, or merging |
references/branch-cleanup.md |
Explicit branch cleanup requests, merged/stale branch checks, safe branch deletion |
references/bisect.md |
Finding the commit that introduced a regression via manual or automated git bisect |
references/submodules.md |
Cloning, adding, updating, or removing Git submodules |
Default Workflow
- Read repo-specific Git guidance.
- Run
git status --short. - Load the relevant reference file.
- Inspect branch, base, remote, and staged changes as needed.
- Choose the least surprising safe Git operation.
- If the user asked you to commit, follow the Commit Safety Checklist.
- If the user asked you to push, push with upstream tracking on first push.
- If the user asked for GitHub PRs, checks, releases, or
ghCLI workflows, usegithub-workflow.