git am para coding agents: mailbox a commits, no un diff suelto
Resumen
git am parte un mbox de format-patch, aplica y committea con autor y Subject. ORIG_HEAD antes. Conflicto: --abort, no --continue a ciegas. Cero --3way/--reject/--signoff/--no-verify autónomo. Git 2.50.1.

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 am aplica una serie de parches de un mailbox y crea commits. El man (git-am(1); git-scm.com/docs/git-am HTTP 200, last-modified 2026-08-31, last updated in 2.55.0; pie del man local Git 2.54.0, 2026-04-19; binario Git 2.50.1 / Apple Git-155): Splits mail messages in a mailbox into commit log messages, authorship information, and patches, and applies them to the current branch. Es el reverso de git format-patch en historia lineal. SEE ALSO: git-apply(1), git-format-patch(1).
No es cherry-pick. Cherry-pick copia un objeto commit del grafo. am lee un mbox. Tampoco git apply: apply pega bytes y no committea. El man de apply: This command applies the patch but does not create a commit.
Contrato: mbox de format-patch, worktree limpio, 0 = commits hechos, 128 = sesión abierta → --abort. Cero --3way / --reject / --signoff / --no-verify / --continue autónomo.
Qué hace (y qué no)
Antes de aplicar, el man pone ORIG_HEAD en la punta actual. Autor = From:. Fecha de autor = Date:. Título = Subject: sin el prefijo [PATCH …]. El cuerpo hasta el diff es el mensaje. Committer = tú, ahora.
Verificado 2026-09-04 (Git 2.50.1 / Apple Git-155), repo de un archivo f.txt y git format-patch -1 --stdout de feat: change b:
- Worktree limpio, padre igual al del parche:
git am file.patch→ 0,Applying: feat: change b. HEAD avanza. Autort <t@t>, subjectfeat: change b.ORIG_HEAD= SHA previo. - En rama
topicdesde el mismo padre: 0, SHA nuevo (c755325≠ originaldf69ff6). Mismo árbol y mensaje no reutilizan el objeto. - Serie
format-patch -2: 0, dosApplying:seguidos, dos commits. - Stdin (
git am < two.patch): 0, igual. git applydel mismo mbox: 0, statusM f.txt, log no avanza.- Ya aplicado: patch does not apply, 128, sesión en
.git/rebase-apply.--abort→ 0, log intacto. - Working tree sucio (
f.txt≠ índice): does not match index, 128, sesión abierta.--abort. - Conflicto (línea local
bXvs parcheb2): 128, status limpio salvo la sesión.--show-current-patch=diffimprime el hunk.--continuesin resolver: No changes - did you forget to use 'git add'?, 128.--abort→ 0, log enlocal diverge. --3wayen el mismo conflicto: Falling back to patching base and 3-way merge,CONFLICT (content),UU f.txt, marcadores<<<<<<<. 128.--abortrestaurabX(man: Revert the contents of files involved).--signoff: 0, trailerSigned-off-by: t <t@t>.--no-verify: 0 (saltapre-applypatch/applypatch-msg; el man:post-applypatchno se salta).- Archivo vacío: Patch format detection failed., 128.
- Mail sin diff (
--empty=stop, default): Patch is empty., 128, sesión.--empty=drop→ 0, Skipping, sin commit.--empty=keep→ 0, commit vacío con el Subject. --reject: 128, dejaf.txt.rej.--quiet: 0, sinApplying:.--skiptras conflicto: 0, el parche no entra, HEAD sigue en el diverge.--quittras conflicto: 0, sesión muere, HEAD e índice intactos (man: keep HEAD and the index untouched).
am exige un repo. Apply sin --index no.

Lo que el agente sí / no corre
| Quiero | Comando | Trampa |
|---|---|---|
| Traer commits de un mbox | git am -- "$mbox" | git apply del mismo archivo |
| Ver el parche trabado | git am --show-current-patch=diff | volcar el mbox al LLM |
| Salir del 128 | git am --abort | --continue / --skip / --quit a ciegas |
| Copiar un SHA del grafo | cherry-pick | am de un diff inventado |
| Pegar bytes sin commit | git apply --check luego git apply | creer que apply ya committeó |
| Cerrar el cambio | status -sb + PR | push a main |
Prohibido en autónomo:
--3way/--ours/--theirs. El default falla si no pega limpio (am.threeWaydefault false).--3waydeja conflict markers. Resolución a ciegas no.--reject. Pasa--rejecta apply. Verificado:*.rejy 128.--continue. El man: el índice debe guardar el resultado a mano. Singit add, 128.--skip/--quit.--skiptira el parche.--quitdeja el árbol a medias. El default de salida es--abort.--signoff. Añade tu identidad al mensaje. Un agente no firma DCO por Marco.--no-verify/-n. El man correpre-applypatchyapplypatch-msgpor default.--committer-date-is-author-date/--ignore-date. El man: allows the user to lie sobre fechas. El walker asume timestamps no decrecientes.--interactive. Pide TTY.--directory,-p,--include/--exclude,--whitespace=fix. Cambian dónde o qué pega.--empty=keep/--allow-empty. Inventan commits vacíos.- Tratar SHA coincidente como “el mismo objeto”. Verificado: en rama, SHA nuevo.
El mbox se genera con git format-patch. Un agente que fabrica el From: / hunk y lo pasa a am está un paso más allá de este comando.
Receta (60 segundos)
Solo en un worktree propio, árbol limpio:
git status -sb
git am -- "$mbox" || { git am --abort; exit 1; }
git status -sb
git log --oneline ORIG_HEAD..HEAD
Si sale 128: --abort. Cero --3way, cero --reject, cero --continue. Reporta el error y para.
Si el árbol queda mal: --abort primero. No reset --hard ni restore a ciegas con sesión abierta.
Cierre = PR. Cero push a main.

am vs apply vs cherry-pick
am parte correo, aplica y committea. apply pega el diff; HEAD quieto. cherry-pick replaya un commit del objeto store.
Un agente que “aplica el PR” con git apply de un git diff no replica autor ni mensaje. Si el ticket es “trae estos commits de un format-patch”, este comando. Si el ticket es “pega este diff en el disco”, apply. Si el ticket es “trae el SHA abc que ya está en el clone”, cherry-pick.
El man (CAVEATS): un diff sin indentar en el mensaje de commit puede aplicarse como parche o tumbar am. Un Markdown con fence de diff es un caso. No “arreglar” el mbox a ciegas.
am se niega a leer otro mailbox hasta cerrar la sesión. El man: si vas a empezar de cero, --abort antes.
Checklist
- Worktree propio.
git status -sblimpio. Un mbox deformat-patch. -
git am -- "$mbox". 0 = commits. 128 =--abort. - Cero
--3way/--reject/--continue/--skip/--signoff/--no-verify. -
ORIG_HEAD..HEADcon log--oneline. No dump-p. - Cierre = PR, no push a
main.
FAQ
¿git am es lo mismo que git apply? No. Apply no crea commit (man apply). Verificado: apply deja M f.txt; am avanza HEAD.
¿El SHA se conserva? No. Verificado en rama: SHA nuevo. Autor y mensaje sí vienen del mbox.
¿--3way “por si acaso”? No. Default falla limpio. Con el flag, UU y marcadores. Nunca en autónomo.
¿--abort o --quit? --abort. El man restaura rama y archivos. --quit deja HEAD/índice.
El curso instalar un agente cubre el loop local. Hub: comparativas y decisiones. am no es cherry-pick: lee mailbox, no un SHA del grafo.
Lecturas relacionadas
Sigue explorando Coding Agents y otras piezas para builders.

git merge-tree para coding agents: merge en seco, sin tocar el índice

git cherry para coding agents: +/− por patch-id, no por SHA

git format-patch para coding agents: mailbox, no un diff suelto
