Guía9 min

git log para coding agents: A..B, A...B y no volcar historia

Resumen

git log lista commits alcanzables, no un rango de diff. A..B es ^A B. A...B es diferencia simétrica. Un agente limita con -n, --oneline o --format y no vuelca -p al LLM. Git 2.50.1.

GitHub
Walk de parent links: git log resta conjuntos de commits, no compara dos árboles

Qué resuelve

Esta pieza se queda en la decisión práctica: qué instalar, qué riesgo agrega y cómo aplicarlo sin romper operación.

git log no es “muéstrame el PR” ni un diff. El man (Git 2.50.1 / Apple Git-155; git-scm.com/docs/git-log HTTP 200, man 2.55.0 del 2026-06-29): lista commits alcanzables siguiendo parent links desde los commits dados, resta los alcanzables desde los que van con ^, y emite el resto en orden cronológico inverso por default.

Es una operación de conjuntos. git log foo bar ^baz = alcanzables desde foo o bar, menos los de baz. Esta guía no sustituye PRs con gh. El contrato: qué forma corre un agente, qué flags están prohibidas, y cómo no inundar el contexto.

Dos puntos vs tres puntos

El man (DESCRIPTION):

FormaEquivale aQué ves
git log A..Bgit log B ^Aalcanzables desde B, no desde A
git log A...Bgit log A B --not $(git merge-base --all A B)diferencia simétrica (útiles en merges)
git log origin..HEADgit log HEAD ^origincommits de HEAD que origin no tiene

A..B en log es rango de revisiones (gitrevisions(7)). En git diff, A..B no es un rango: compara dos extremos. Un agente no copia la notación de un comando al otro.

GitHub Docs (HTTP 200, 2026-09-03, Comparing commits; canónica /pull-requests/how-tos/commit-changes/comparing-commits): la UI /compare usa base (inicio) y compare (fin). No sustituye git log origin/main..HEAD --oneline. Para “qué introduce mi topic” el agente corre log con --oneline -n, no abre compare a ciegas.

-- antes de paths. git log HEAD -- ./src/foo.ts no se confunde si existe una rama src. --follow sigue un solo archivo más allá de renames.

A..B resta conjuntos; A...B es diferencia simétrica

Lo que el agente sí / no corre

QuieroComandoTrampa
¿Qué hay en mi topic vs origin?git log --oneline -n 20 origin/main..HEADgit log sin -n
¿Qué me falta del remoto?git log --oneline -n 20 HEAD..origin/maininvertir A..B “de memoria”
¿Hubo merge noise?git log --oneline --first-parent -n 20--graph al LLM
¿Mensajes con “WIP”?git log --oneline --grep=WIP -n 20--grep sin -n
¿SHA concretas, sin ancestros?git log --no-walk --oneline <sha>…--no-walk + --graph

Prohibido en autónomo:

  • git log / git log -p / git log --stat sin -n / --max-count y sin --oneline o --format. El man: -n <number> / --max-count=<number> limita a N commits. Sin techo, un repo de 10k commits come la ventana.
  • -p / --patch al LLM. El man toma opciones de git-diff(1) para cómo mostrar el cambio de cada commit. El parche no es el log.
  • --graph al prompt. El man: dibuja historia a la izquierda; imprime líneas extra; no combina con --no-walk; implica --topo-order.
  • --all “para no perderme ramas”. El man: finge que todas las refs de refs/ más HEAD están en la línea de comando. Mezcla stash, tags y remotos.
  • --reverse + dump. El man aplica filtros antes de ordenar; --reverse no es un pager.
  • Tratar A...B de log como el three-dot de un PR en GitHub. El man: simétrica. El PR en GitHub es otra UI.
  • Correr log en el checkout del humano. Worktree propio (worktrees).

--oneline = --pretty=oneline --abbrev-commit. --format='%h %s' es parseable. %H es el hash completo; %h el abreviado; %s el subject; %an el autor. Un agente que decide “tocar o no” usa --oneline -n, no medium.

--first-parent: al ver un merge, sigue solo el primer padre. El man: da mejor overview de un topic porque los merges al topic suelen ser “ajustarse al upstream”. Cambia el diff default de merges a first-parent.

Receta (60 segundos)

Solo en un worktree propio:

git status -sb
git fetch origin
git log --oneline -n 20 origin/main..HEAD
git log --oneline -n 20 HEAD..origin/main

Si el primer rango está vacío, el topic no introduce commits. Si el segundo tiene filas, falta integrar: pull --ff-only, no un log infinito.

Paths al add salen de status/diff, no de git log -p. SHA para un revert o cherry-pick salen de --oneline -n, no de --all --graph.

--oneline -n limita; -p y --graph no van al LLM

Scripts y seguridad

--max-count / -n es el techo. --skip salta N y sigue emitiendo; no es un pager seguro sin otro -n.

--grep=<pattern> limita a commits cuyo mensaje tiene una línea que matchea. El man: se aplica antes de ordenar. Sin -n, un grep amplio sigue siendo un dump.

--no-walk[=(sorted|unsorted)]: muestra solo los commits dados, sin recorrer ancestros. Sin efecto si hay un rango. unsorted respeta el orden de la línea de comando. No combina con --graph.

--decorate (default auto): en terminal imprime refs cortas (refs/heads/ omitido). Un agente que parsea --format='%h %s' no necesita decorate.

Cero pipes de git log -p a git apply en el checkout del humano. Restaurar un archivo es restore.

Checklist

  • Worktree propio, git status -sb.
  • “Qué introduce mi rama” = git log --oneline -n 20 origin/main..HEAD.
  • “Qué me falta” = git log --oneline -n 20 HEAD..origin/main.
  • Siempre -n / --max-count. Cero -p al LLM. Cero --graph. Cero --all.
  • A..B de log ≠ A..B de diff. A...B de log es simétrica, no el compare de GitHub.
  • --no-walk solo para SHA concretas; nunca con --graph.
  • Add por paths. Cero push a main.

FAQ

¿git log es el PR? No. GitHub Docs: compare es base→compare en /compare. git log sin args es HEAD hacia atrás, sin techo.

¿A..B vs A...B? El man: A..B = B ^A. A...B = diferencia simétrica (A B --not $(git merge-base --all A B)). No es el three-dot de un PR.

¿--oneline vs --format? --oneline = --pretty=oneline --abbrev-commit. --format='%h %s' es el contrato para scripts.

¿Puedo git log --graph --all para “entender el repo”? El man: --all mete todas las refs; --graph añade líneas extra y no combina con --no-walk. No cabe en un prompt.

El curso instalar un agente cubre el loop local. Hub: comparativas y decisiones. Log no es sandbox (sandboxing) ni deshacer unstaged (restore).

Verificado 2026-09-03 contra git-log(1) (Git 2.50.1 / Apple Git-155), git-scm.com/docs/git-log (HTTP 200, man 2.55.0) y GitHub Docs “Comparing commits” (HTTP 200, canónica /pull-requests/how-tos/commit-changes/comparing-commits).