¿Cuál es la diferencia entre git am y git apply?

134

Ambos git amy git applyse pueden usar para aplicar parches. No logro ver la diferencia. Ahora veo una diferencia: git amconfirma automáticamente mientras que git applysolo toca los archivos pero no crea una confirmación. ¿Es esa la única diferencia?

Christoph
fuente
11
ampodría considerarse como una abreviatura de Apply Mail...
Philip Oakley

Respuestas:

144

Tanto la entrada como la salida son diferentes:

  • git applylleva un parche (por ejemplo, la salida de git diff) y lo aplica al directorio de trabajo (o índice, si --indexo --cachedse utiliza).
  • git amtoma un buzón de confirmaciones formateadas como mensajes de correo electrónico (por ejemplo, la salida de git format-patch) y las aplica a la rama actual.

git amusa git applydetrás de escena , pero hace más trabajo antes (leer un Maildiro mbox, y analizar mensajes de correo electrónico) y después (crear confirmaciones).

georgebrock
fuente
66
Nota: git applyparece aceptar también la git format-patchsalida.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
77
git applytambién funcionaría para la salida de git format-patch, pero los cambios no se realizarían por etapas y tendrían que confirmarse (creando así un punto de confirmación diferente en el índice al que se aplican). Con git amusted llevaría la información de confirmación (junto con el autor, etc.) al índice al que se aplica. git applyluego es para parchar su repositorio (malo), git ampuede tomar cambios legítimos de características e incluirlo en su repositorio (enfoque preferido).
Prasoon Joshi
18

git applyes para aplicar diferencias directas (por ejemplo, desde git diff) mientras que git ames para aplicar parches y secuencias de parches de correos electrónicos, ya sea en formato mbox o Maildir, y es el "opuesto" de git format-patch. git amintenta extraer mensajes de confirmación y detalles del autor de los mensajes de correo electrónico, por lo que puede realizar confirmaciones.

CB Bailey
fuente
9

Cuando git amaplique el parche, si lo usa git status, no verá ningún cambio local.

git applyle permite realizar los cambios en los archivos de origen como si estuviera escribiendo el código usted mismo, en consecuencia git statusy git diffgenerará los cambios realizados en el parche que ha aplicado, luego puede corregir / agregar más cambios y enviarlos juntos como un nuevo parche .

0x90
fuente