agentleFS
hyperb1isshyperb1iss/hyperskills/skills/git/SKILL.md

git

Skill36 starsChanged 21 days agoMITView on GitHub

Use this skill for complex git operations including rebases, merge conflict resolution, cherry-picking, branch management, PR branch upkeep, or repository archaeology. Activates on mentions of git rebase, merge conflict, cherry-pick, git history, branch cleanup, git bisect, worktree, force push, force-with-lease, PR branch, stacked PR, squash-merge, lease, shared repo, or complex git operations.

  • Deletes or force-pushes
  • Installs packages
  • Commits and pushes

57 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use sql, databases and 9 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • thechandanbhagatSkill

    sql

    Write SQL queries, optimize database performance, design schemas, and debug SQL issues. Use for database operations, query optimization, and schema design.

    Also in 4 projects that use this

  • mrgoonieSkill

    databases

    Work with MongoDB (document database, BSON documents, aggregation pipelines, Atlas cloud) and PostgreSQL (relational database, SQL queries, psql CLI, pgAdmin). Use when designing database schemas, writing queries and aggregations, optimizing indexes for performance, performing database migrations, configuring replication and sharding, implementing backup and restore strategies, managing database users and permissions, analyzing query performance, or administering production databases.

    Also in 3 projects that use this

  • mrgoonieSkill

    devops

    Deploy to Cloudflare (Workers, R2, D1), Docker, GCP (Cloud Run, GKE), Kubernetes (kubectl, Helm). Use for serverless, containers, CI/CD, GitOps, security audit.

    Also in 4 projects that use this

  • MicrosoftSkill

    typescript

    TypeScript best practices for this monorepo. Use this skill when: (1) writing new TypeScript code, (2) reviewing TypeScript code, (3) working with API responses, fetch calls, or JSON parsing, (4) adding or modifying types and interfaces.

    Also in 4 projects that use this

  • VercelSkill

    react

    React renderer for json-render that turns JSON specs into React components. Use when working with @json-render/react, building React UIs from JSON, creating component catalogs, or rendering AI-generated specs.

    Also in 3 projects that use this

  • Microsoft AzureSkill

    test

    Also in 8 projects that use this

The file

We split this skill into the rules it gives an agent

8 rules. 0 are common, 5 are distinctive, and 3 are very specific to this project.

  • 0

    Common

    Most of the 51 edited versions we read keep these.

  • 5

    Distinctive

    This author's own choices. Worth a look.

  • 3

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  • could be automatic: a setting could enforce it
  1. Distinctive:

    When a parent PR squash-merges, its commits vanish from main's ancestry.

    line 35
  2. Very specific:

    Lockfile check: after a rebase touches a lockfile, verify with the gate's exact command in a throwaway worktree.

    line 100
  3. Very specific:

    No parallel git commands during surgery: index.lock collisions are self-inflicted

    line 174
  4. Very specific:

    When the sequencer wedges ("patch staged, commit not recorded"), read .git/rebase-merge state files and resume with git commit -C <sha> …

    line 175
  5. Distinctive:

    Regenerate encoded artifacts: never text-merge them

    line 181
  6. Distinctive:

    Not for routine git status or simple commits.

    line 208
  7. Distinctive:

    Not permission to rewrite genuinely shared history.

    line 209
  8. Distinctive:

    Not a replacement for understanding the diff before committing.

    line 210

“Common” is measured: kept by at least 6 in 10 of the 51 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Git Operations

Advanced git workflows: rebase surgery, conflict resolution, and coexistence in shared multi-agent repos.

PR Branch Upkeep

The most-run workflow: keeping your own PR branch current against a moving main.

Capture the target base and remote branch tip, preserve a backup, rebase when required, and run checks on the resulting content. Recheck remote state before pushing. A base that keeps moving is not a reason for an endless rebase loop: use the captured base and the repository's merge policy. When current-main ancestry is required, check it explicitly:

git merge-base --is-ancestor origin/main HEAD && echo "based on current main"

Review etiquette: while a reviewer (bot, human, or agent) is actively reading, hold pushes. Batch fixes, then one rebase+push when the review lands. Freshness loops run at push boundaries.

Pushing rewritten history

Pin the lease to the remote tip whose work you inspected before rewriting. Background fetches can refresh a tracking ref and weaken an implicit lease. Recheck with ls-remote before pushing; if the tip changed, inspect and reconcile that work instead of copying its SHA into a fresh lease:

git ls-remote origin refs/heads/<branch>   # compare with the previously captured and inspected remote tip
git push --force-with-lease=refs/heads/<branch>:<expected-sha> origin HEAD:<branch>

On a "stale info" rejection, diagnose with ls-remote before any retry. Observed causes: auto-delete-on-merge removed the branch, a typo'd lease SHA, or the remote legitimately moved. Bare --force is not an escalation path.

After the base squash-merges

When a parent PR squash-merges, its commits vanish from main's ancestry. A plain rebase replays them as ghosts. Detect the merge type first: squash, rebase-merge, and merge-commit each leave different ancestry.

SituationMove
Parent PR squash-mergedgit rebase --onto <new-base> <old-base-sha>: only your own commits replay
Replay keeps conflicting / branch pollutedRebuild as main + delta: one git diff --binary patch from the backup, applied onto fresh main; prove with range-diff
Pushing fixes to an old branchVerify PR open-state first. A squash-merged PR's branch is dead
Stacked chainCascade bottom-up with --onto, per-level backup, push bottom-first (validators diff against origin/<base>)

Pre-Surgery Ref Reality

Local refs and the forge's view routinely disagree. Before any history surgery:

  • Inspect the fetch mapping when tracking refs matter. git fetch origin main updates origin/main under the usual configured refspec; use git fetch origin refs/heads/main:refs/remotes/origin/main when an explicit mapping is needed
  • git rev-parse --is-shallow-repository: shallow history can hide the real merge base; deepen when ancestry is incomplete
  • Cross-check gh pr view base/head oids against local rev-parse / ls-remote
  • Probe conflict shape for free: git merge-tree --write-tree origin/main <branch>. A clean merge predicts textual compatibility, not semantic correctness or whether branch policy requires a restack
  • Pin every operation to a captured SHA, never a moving ref

Conflict Resolution

Conflicts are intent-merges, not side-picks. Read all three index stages (git show :1:<file> :2:<file> :3:<file>) plus the pre-rebase tip before resolving, and ask: did upstream obsolete this branch's mechanism? When main replaced it with a newer abstraction, plug your feature into main's shape instead of resurrecting the old one. Preserve invariant-explaining comments. Pace by risk class (slower on security-sensitive files). Close with a mechanical conflict-marker scan; survivors are real.

SituationStrategy
Encoded artifact (lockfile, SOPS, generated schema)Never text-merge the encoding. Merge the meaning, re-encode with the canonical tool, roundtrip-verify.
Simple content conflictResolve as a union of both sides' intent; prefer the smallest diff.
Large structural conflictConsider --ours/--theirs + manual reapply of the smaller side.

Lock files

Resolve package manifests first. Inspect both lockfile sides and choose the intended baseline deliberately, then regenerate with the pinned package manager. During rebase, ours is the rebased upstream and theirs is the replayed commit; those labels do not mean mine and upstream. Example after choosing the upstream baseline:

git restore --ours --worktree pnpm-lock.yaml
pnpm install --lockfile-only
git add pnpm-lock.yaml

Same shape for any generated lockfile. Fold the regenerated lockfile back into the commit that carried it.

Rebase vs Merge

Ownership and review state decide, not pushed-ness:

SituationUse
Your own PR branch behind main (pushed or not)Rebase + pinned-lease push. Hold pushes while a review is actively reading.
Branch checked out in another worktreeWork there; don't steal the checkout.
Genuinely shared branch (others based work on it)Never rebase. Merge, or git revert for published mistakes.
Cleaning up messy commits before PRgit rebase -i with squash/fixup

Ceremony scales with collaborator count (a solo repo can live on main), but the push-boundary rules hold regardless.

Undo Operations

What happenedFix
Uncommit / squash (keep changes staged)git reset --soft <captured-sha>: never a moving ref. reset --soft origin/main mid-squash silently staged reverts of newly-landed main when the ref moved. Re-check base movement before amending.
Need to recover something lostInspect reflog, status, and log, then preserve the candidate with git branch recovery/<name> <sha>. Inspect that ref before switching or restoring anything

Verify Before You Trust

Regenerating or rebasing is not the same as verifying the result. In a concurrent monorepo, prove it.

Lockfile check: after a rebase touches a lockfile, verify with the gate's exact command in a throwaway worktree. pnpm install --lockfile-only is vacuous: it never materializes snapshots, so it reports "up to date" while a full install fails.

git worktree list
# Choose an unused path under the repository's worktree convention.
check_tree="$HOME/dev/worktrees/<project>/nova/lockcheck-<unique>"
git worktree add --detach "$check_tree" HEAD
(cd "$check_tree" && pnpm install --frozen-lockfile)
# Inspect the result and status before removing the worktree you created.
git worktree remove "$check_tree"

A passing check that disagrees with an observed failure is itself a finding. Diagnose why the check is vacuous, upgrade the standard.

Bracket every rewrite: backup ref before, range-diff proof after. Persist the proof inputs so the receipt can be reconstructed exactly:

backup=backup/pre-rebase-$(date +%Y%m%d-%H%M%S)
git branch "$backup" && old_base=$(git merge-base HEAD origin/main)   # persist both to a scratch file
git rebase origin/main
git range-diff "$old_base".."$backup" origin/main..HEAD   # explicit ranges: the three-dot shorthand can include main's new commits

Clean ≠ correct. Zero conflicts prove nothing about semantics. After any rewrite, run the semantic drift audit: full gates on the rebased SHA, range-diff read as a bug detector (it catches resolutions rolling back newer main), symbol greps across HEAD vs origin/main vs the backup ref, syntax checks on every resolved file. Files new on your branch merge "cleanly" while still importing what upstream deleted. Typecheck catches it, the merge doesn't.

Proofs

Match the proof to the claim:

Claim to proveProof
Replay preserved per-commit intentgit range-diff <old-base>..<old-tip> <new-base>..<new-tip> (explicit ranges)
Squash/reshuffle left the tree identicalgit rev-parse HEAD^{tree} equality vs the backup ref (sharper than range-diff for N→1 squashes)
Cherry-pick / second PR carries same changegit patch-id --stable on both
Nothing stranded before deletionAncestry checks plus tree/patch comparison for squash merges; inspect dirty worktrees before deletion
Merge captured everythingContent-parity diff after the merge event

History Serves Its Readers

Atomic while working; collapse only when the history itself stops serving the reviewer.

ConcernMove
Squashing a reviewed branchThe PR body inherits the narrative. Enumerate the logical commits the squash removed. Human-authored PR titles, bodies, and drafts are read-only absent explicit instruction.
Post-review fixesgit commit --fixup=<logical-parent> + autosquash, not a "review fix" blob. Fix at the introducing commit when CI reads history (diffs HEAD~1) rather than the tree.
PR ancestry poisoned (wrong-base merge, CODEOWNERS dragnet)The forge computes review surface from ancestry. Merge gymnastics to dodge a force-push is worse than the force-push. Recover: push the clean replacement first, close the old PR with a pointer comment naming the replacement and why, then reopen.
Stale failed check inherited from a closed PRInspect the failure and rerun the appropriate check on the intended artifact. Do not rewrite history merely to change a status badge.

Commit bodies

Compose multi-line bodies via git commit -F - with a single-quoted heredoc (<<'EOF') or a message file. Stacked -m flags keep each paragraph as one unwrapped line and burn amend cycles. The quoting is the protection: an unquoted heredoc executes backticks and $() inside the message before Git sees it. Wrap at 76 characters; length checks are backstops, not the mechanism. Verify the recorded message after any shell-composed body (git log -1 --format=%B). Receipts, ticket ids, and issue links belong in commit bodies, not in code comments or error strings, where they read as unfinished work.

Shared-Repo Coexistence

Multiple agents (and humans) work the same repo concurrently. Causation decides ownership.

SignalMove
Ambiguous churn in shared filesRestore churn your own commands generated; leave others' work untouched, even in the same file
Co-edited file, mixed hunksStage only your hunks (git add -p, or a hand-built patch via git apply --cached --unidiff-zero), then commit the index: git commit <file>/--only commits the worktree copy and swallows unstaged sibling hunks
index.lockTriage before removing: owning operation and process (lsof/ps). Git lockfiles can be empty while active; no visible open handle alone does not establish staleness. Remove only after confirming the owning operation ended
Another agent's rebase in progressHold your verified commit, but a blocker must reproduce before you report it, and after repeated blocked turns escalate with pid + age as a question, not a fact
Branch checked out in another worktreeWork there; don't steal the checkout
Multi-worktree editsEdit tools root at the original cwd. Identity-check (git branch --show-current + pwd) before editing; status-check every involved worktree after

Hooks

Hooks are receipts, not friction. Wait them out and cite their output. A new hook failure gets fixed, never bypassed (pre-warm the build cache, fix the type error). The bypass window is narrow: the failure is known, named, pre-existing, and unrelated to your diff (or the hook physically can't run here) plus equivalent gates ran green, and the bypass is disclosed in the wrap-up. Some hosts mechanically block --no-verify; respect it. Auto-fixing hooks can rewrite unrelated files: diff after every commit, and before restoring a hook-touched file confirm it carried no one else's edits pre-hook (git restore discards the whole worktree copy, not just the hook's hunks).

Non-Interactive Surgery

Agent hosts have no tty:

  • GIT_SEQUENCE_EDITOR=true GIT_EDITOR=true pre-armors rebases; a stuck editor gets its pid killed, never the rebase
  • No parallel git commands during surgery: index.lock collisions are self-inflicted
  • When the sequencer wedges ("patch staged, commit not recorded"), read .git/rebase-merge state files and resume with git commit -C <sha> instead of firing recovery commands speculatively

Safety Rules

  1. Never rebase genuinely shared branches: your own PR branch is yours to rebase
  2. Pin the lease: --force-with-lease=refs/heads/<branch>:<sha>, confirmed via ls-remote immediately before the push; never bare --force
  3. Regenerate encoded artifacts: never text-merge them
  4. Backup ref before destructive ops: git branch backup/pre-op-$(date +%Y%m%d-%H%M%S); recovery infrastructure, not ceremony, so persist the name and old base to a scratch file
  5. Prove history rewrites: backup the pre-rewrite head, then explicit-range range-diff to confirm every changed commit is intentional
  6. Identity-check before edits in multi-worktree repos: git branch --show-current + pwd

Anti-Patterns

Anti-PatternFix
Manually merging generated lockfilesTake one side, regenerate with the package tool
Trusting a lockfile check that never installsVerify with the gate's exact command (pnpm install --frozen-lockfile) in a throwaway worktree
Plain rebase over a squash-merged basegit rebase --onto <new-base> <old-base-sha>: only your commits replay
Merge gymnastics to dodge a force-push on a PR branchProper rebase + pinned-lease push. Ancestry poisoning triggers review dragnets
Rebasing a genuinely shared branchMerge, or create a new branch
Using --forcePinned --force-with-lease only when approved
Stacked -m flags for multi-line commit bodiesgit commit -F - heredoc or a message file
Running recovery commands by habitInspect status, log, and reflog first
Staging unrelated workStage owned paths or hunks, inspect the complete index, then commit without path arguments; coordinate if someone else owns staged work
git checkout <commit> -- <paths> then committingIt stages silently; check git diff --cached --name-only before each commit or it swallows unintended files
Assuming a rebase kept your commitsProve it: explicit-range range-diff, tree-hash, or patch-id per the proofs table

Sources and Applicability

Reviewed 2026-09-04 and 2026-10-27; sources and their limits are in references/evidence.md.

What This Skill is NOT

  • Not for routine git status or simple commits.
  • Not permission to rewrite genuinely shared history.
  • Not a replacement for understanding the diff before committing.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.