Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when writing a git log or shortlog command to extract commit history data: pick the exact pretty-format placeholders and stat/date/filter flags — which cheaper models guess wrong or confuse author with committer.
.claude/skills/git-log-history-extraction/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 86% | 10 |
| Model | Lift | Δ tokens | Δ turns | Cases | Verified |
|---|---|---|---|---|---|
| gemini-3.6-flashbest | +9% | +191% | 0% | 22 | 54d ago |
| gemini-3.5-flash | pending re-run | — | |||
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | — | — |
| case-14 | ✗→✓ | ▲ Improved | — | — |
| case-04 | ✗→✗ | = Same ✗ | — | — |
| case-10 | ✗→✗ | = Same ✗ | — | — |
| case-22 | ✗→✗ | = Same ✗ | — | — |
Enforces Git's real, documented pretty-format placeholders and git log / git shortlog flags whenever you write a command to pull commit history into a report, script, or table. Apply whenever the task is "give me a command that lists / counts / summarizes commits" — even when no placeholder is named.
Every person/date placeholder comes in two families. %a… = author (who wrote the change, and when it was originally written). %c… = committer (who applied it, and when it landed). A rebase, cherry-pick, or amend keeps the author but rewrites the committer. When the task says "who wrote it" / "when it was written," use the %a… form; use %c… only when the task is explicitly about when it was committed/merged.
--format= / --pretty=format:)| token | expands to | |---|---| | %H | full 40-char commit hash | | %h | abbreviated commit hash | | %an | author name | | %aN | author name, respecting .mailmap (folds duplicate identities) | | %ae | author email | | %aE | author email, respecting .mailmap | | %s | subject (first line of the message) | | %b | body (everything after the subject and the blank line) | | %B | raw body (unwrapped subject + body together) | | %ad | author date, rendered per --date= | | %ai | author date, ISO-8601-like: 2026-07-01 11:00:04 -0700 (a space) | | %aI | author date, strict ISO 8601: 2026-07-01T11:00:04-07:00 (a T) | | %at | author date as a UNIX timestamp (seconds) | | %cn / %cN | committer name (N respects .mailmap) | | %cd / %ci / %cI / %ct | committer date (same suffix scheme as author) | | %d / %D | ref names — %d wrapped in (…), %D bare | | %n | a literal newline inside the format string | | %% | a literal percent sign |
Choose your own literal delimiter between placeholders (a |, a tab, %x09). Use --format= (alias --pretty=format:); a bare --pretty=oneline will not let you pick fields.
--since=<date> (alias --after=<date>) — commits more recent than the date.--until=<date> (alias --before=<date>) — commits older than the date.--author=<pattern> — keep only commits whose author matches (regex on name+email).--no-merges — drop merge commits (equivalent to --max-parents=1).--all — walk every ref, not just the current branch.--shortstat — ONLY the summary line: N files changed, N insertions(+), N deletions(-).--numstat — machine-readable per file: added<TAB>deleted<TAB>path; a binary file shows -<TAB>-.--name-only — just the changed file paths, one per line.--name-status — a status letter (A/M/D/R) then the path.--stat is the human diffstat with a +/- bar graph — do NOT use it when youneed parseable numbers; --numstat or --shortstat is what a script wants.
--date=)%ad / %cd render through --date=: --date=short (YYYY-MM-DD), --date=iso, --date=iso-strict, --date=relative, --date=unix, --date=local, or --date=format:<strftime> for a custom string, e.g. --date=format:"%Y-%m-%d". For a fixed shape prefer the direct placeholder (%aI, %at) over %ad + a --date= mode.
git shortlog — per-author talliesgit shortlog groups commits by author. -s (summary) suppresses the descriptions and prints just a count per author; -n sorts by that count (descending) instead of alphabetically; -e shows the email too. The common form is git shortlog -sn. Do NOT hand-roll git log --format="%an" | sort | uniq -c | sort -rn — git shortlog -sn is the built-in, and it also honors .mailmap.
Each shows the base model's wrong default (BEFORE) and the conforming form (AFTER).
Full hash + author name + subject, one line each
git log --pretty="%h - %cn: %s" (abbrev hash, committer name)git log --format="%H|%aN|%s"Author date in strict ISO 8601 (with a T)
git log --format="%ad" --date=iso (space-separated, ISO-like)git log --format="%aI"Author date as a UNIX timestamp
git log --format="%ad" --date=unixgit log --format="%at"Per-file added/deleted counts a script can parse
git log --stat (graph bars, not parseable)git log --numstat --format="%H"Only the files-changed / insertions / deletions totals
git log --stat | tail -1git log --shortstat --format=""Count commits per contributor, most first
git log --format="%an" | sort | uniq -c | sort -rngit shortlog -snJust the changed file paths
git log --stat --format=""git log --name-only --format=""Exclude merge commits from a range
git log --format="%H %s" (merges included)git log --no-merges --format="%H %s"Only one person's commits
git log --format="%an %s" | grep "Ada"git log --author="Ada" --format="%s"(%ad/%ai/%aI/%at); it is when the work was written. Use committer (%cd) only when the task is about when it merged/landed.
forms %aN / %aE (and git shortlog, which folds mailmap identities).
% in the output → escape it as %%; a literal newline insideone record → %n, not a real line break in the shell string.
--numstat show - for both counts, not 0 — a parsermust treat - as "not countable," not as zero.
--since/--until take flexible dates — an absolute 2026-03-11, an ISOtimestamp, or relative text like "2 weeks ago"; all are valid.
--shortstat still prints the commit header unless you pass --format=""to blank the per-commit line; combine them for a totals-only stream.
%cn / %cd for "who wrote it / when written." DO use the authorforms %an (%aN) / %ad (%aI / %at).
%h when a full hash is asked for. DO use %H.--date=iso (that is %ai). DO use %aI.--stat when you need parseable numbers. DO use --numstat(per file) or --shortstat (totals).
git log | sort | uniq -c author tally. DO use git shortlog -sn.--author=<pattern>.--no-merges.%cn, %cd, %ci) when the author is meant.%h (abbreviated) where a full %H was requested.--date=iso (yields the space-separated %ai shape) when strict ISO 8601 witha T (%aI) was asked for.
%ad plus --date=unix instead of the direct %at.--stat (a human bar-graph diffstat) where --numstat or --shortstat is needed.git log --format="%an" | sort | uniq -c | sort -rn instead ofgit shortlog -sn.
--no-merges on a "what changed" listing, so merge commits pollute it.%a…) vs committer (%c…) chosen deliberately.%H for full hash, %h only when abbreviated is asked.%aI strict-ISO, %ai ISO-like, %at UNIX, or %ad+--date=.%aN/%aE when mailmap de-duplication matters.--numstat / --shortstat, never --stat.git shortlog -sn, not a shell pipeline.--author=, --since=/--until=, --no-merges applied as the task needs.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +9 percentage points is the difference between those two pass rates over the 22 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.5-flash | verified | 7/9/2026 | +15% |
Other measured skills in the registry, with their headline benchmark lift.