Use when establishing branching strategies, implementing Conventional Commits, creating or reviewing PRs, resolving PR review comments, merging PRs (including CI verification, auto-merge queues, and post-merge cleanup), managing PR review threads, merging PRs with signed commits, handling merge conflicts, verifying a merge didn't silently drop changes, syncing a long-diverged branch (e.g. master into integration), rebasing a long-lived branch onto a moved base or splitting one into several PRs,…
Use when establishing branching strategies, implementing Conventional Commits, creating or reviewing PRs, resolving PR review comments, merging PRs (including CI verification, auto-merge queues, and post-merge cleanup), managing PR review threads, merging PRs with signed commits, handling merge conflicts, verifying a merge didn't silently drop changes, syncing a long-diverged branch (e.g. master into integration), rebasing a long-lived branch onto a moved base or splitting one into several PRs, integrating Git with CI/CD, setting up git hooks (lefthook, captainhook, husky, pre-commit), or debugging hook-install failures in git worktrees.
The pull-request tooling is GitHub-only — for a GitLab merge request use netresearch-gitlab.
Not for creating releases (use github-release) or diagnosing BLOCKED/won't-merge PRs (use github-project).
Similar popular skills
Related neighbors and high-traction skills in the same topics — useful to compare before installing.
GitHub only. Everything below the branching and commit sections — pr-status.sh, pr-merge.sh, the merge gate, review threads — speaks GitHub GraphQL. A GitLab merge request belongs to netresearch-gitlab; the equivalent glab calls are in references/pull-request-workflow.md § GitHub only.
Critical Rules (Non-Negotiable)
No direct push to main — always open a PR.
No merge before all threads resolved (references/pull-request-workflow.md).
No squash unless asked — preserves atomic commits, signatures, bisection.
No "tested/verified/working" without pasted command output — else say so.
No edits to installed skill/plugin cache paths (~/.claude/skills/, ~/.claude/plugins/cache/, /.bare/) — always the repo worktree, verified by pwd.
Force-push only with --force-with-lease — never plain --force.
Commit before rebase — add → commit → fetch → rebase → push (a dirty tree aborts it).
No editorializing — state what changed, not how good it is (references/no-editorializing.md).
feat MINOR, fix PATCH; full type list and DCO sign-off in references/commit-conventions.md. Breaking: ! after type, or BREAKING CHANGE: in the footer. Branches: feature/TICKET-123-description, release/1.2.0
Hook Detection
ls lefthook.yml .lefthook.yml captainhook.json .pre-commit-config.yaml .husky/pre-commit 2>/dev/null || echo "No hooks"
Install commands per framework: references/git-hooks-setup.md.
PR Merge Requirements
Before merging: threads resolved, CI green (incl. annotations), rebased, signed, and reviewed (human or bot, on the current head). Rebase-only + signed: git merge --ff-only.
Verification
./scripts/verify-git-workflow.sh /path/to/repository
# Gate state, next action:
./scripts/pr-status.sh [-R owner/repo] [PR] [--json] [--watch]
# Merge; refuses when the gate is shut:
./scripts/pr-merge.sh [-R owner/repo] [PR] [--dry-run|--self-reviewed]
# What a repository expects, before the first artifact:
./scripts/repo-contribution-preflight.sh [--repo <dir>] [--section docs|templates|packaging|ci|tools]
# Which copy is installed here (every script answers this):
./scripts/pr-status.sh --version