git-workflow calls itself a router but named two of the six domains it routes to; the other four appeared nowhere in the file. All six are now named, with a routing table in the always-loaded body. git-submodules lost the foreach shell-variable semantics -- only the bare names survived, though $sm_path and $displaypath differ solely by which directory you are in. The table is back. Its relocated commands had also dropped the rtk git prefix its own SKILL.md mandates; 24 of them are re-prefixed. The wider rtk inconsistency across the plugin stays with #113. Also restores git-commits' body and footers output fields, git-branches' tag/ branch detection commands, git-worktrees' git config --worktree, pc-run's ambiguity fallback, git-remotes' git-history boundary, and git-history's pickaxe triggers. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EJJrm5YmacbwMdzZpXcoti
66 lines
3.3 KiB
Markdown
66 lines
3.3 KiB
Markdown
---
|
|
name: git-history
|
|
|
|
description: >
|
|
Use when investigating git history — pickaxe (`-S`/`-G`) or `-L` line-range log
|
|
queries, tracing when a change landed, bisecting what broke something, or
|
|
locating a commit to revert or backport. Not authoring or rebasing commits ->
|
|
`git-commits`. Not a Gitea server's history -> `gitea-branches`.
|
|
|
|
metadata:
|
|
category: git
|
|
source_keys:
|
|
- git-scm-bisect-docs
|
|
- git-scm-log-docs
|
|
- git-scm-diff-docs
|
|
|
|
allowed-tools: Bash
|
|
---
|
|
|
|
## Gotchas
|
|
|
|
- `-S"string"` matches only where the string's *count* changed, so a line edited in place matches `-G"regex"` and not `-S`. Reach for `-G` whenever the string may have moved rather than appeared.
|
|
- `--follow` traces renames for exactly one path. Given several paths or a glob it fails instead of degrading, so run it once per file.
|
|
- Under `git bisect run`, exit `128` or above **aborts the session** rather than marking the commit bad, so a crashing test script ends the search silently.
|
|
- Bisect answering "cannot find exact culprit" beside skipped commits is a complete result: it is as precise as the skip range allows.
|
|
|
|
## Step 1 — Pick the entry procedure
|
|
|
|
| What is known | Procedure |
|
|
|---|---|
|
|
| Content, a file, or a line range to search for | Query the log — Step 2 |
|
|
| Nothing to search for — only that the behaviour changed between two points | Bisect — read `references/bisect.md` |
|
|
| The commit itself, already identified | Step 3 |
|
|
|
|
## Step 2 — Query the log
|
|
|
|
Default to `git log --oneline`, then narrow by whatever is known:
|
|
|
|
- **Content**: `git log -S"string"`, or `-G"regex"` to match any diff line. `--pickaxe-regex` makes the `-S` argument a POSIX ERE; `--pickaxe-all` shows every file in a matching changeset.
|
|
- **A line or function**: `git log -L <start>,<end>:<file>` or `git log -L :<function>:<file>`. Confirm the range resolves before reporting on it — an off-by-one silently omits the target.
|
|
- **A file across renames**: `git log --follow -- <file>`. Without `--follow` the history stops at the rename boundary.
|
|
- **Mainline only**: `--first-parent` follows the integration branch and skips commits merged in from side branches.
|
|
- **Structured output**: `git log --format="%h | %s | %an (%ar)"`.
|
|
|
|
If you need the placeholder catalogue, format presets, `--diff-filter` letters, full `-L` syntax, ancestry filters, pickaxe binary-file behaviour, or `git diff` output-control flags such as `--stat`, `--word-diff` and the whitespace options, read `references/git-log-format.md`.
|
|
|
|
## Step 3 — Act on a located commit
|
|
|
|
Offer the operation and its consequence; run it only once the user has chosen.
|
|
|
|
- `git cherry-pick <commit>` copies the commit's changes onto the current HEAD — for backporting a fix to another branch.
|
|
- `git revert <commit>` adds a new commit undoing it — for un-applying merged work without rewriting history.
|
|
- `git blame <file>` attributes each line to the commit that last touched it, when the question is which commit introduced one specific line.
|
|
|
|
For diff output control on the located commit, read `references/git-log-format.md`.
|
|
|
|
## Step 4 — Return the result
|
|
|
|
Report each located commit in this shape, so a calling agent can act on it without reparsing raw log output:
|
|
|
|
```text
|
|
<sha> — <subject>
|
|
<author> (<relative date>)
|
|
Recommendation: <action or "none">
|
|
```
|