from git patch squash git-squash

from - git patch



¿Cómo comprime squashs en un parche con formato de parche git? (8)

Basado en la respuesta de Adam Alexander:

git checkout newlines ## must be rebased to master git checkout -b temporary # squash the commits git rebase -i master git format-patch master

Tengo ocho commits en una rama que me gustaría enviar por correo electrónico a algunas personas que aún no están iluminadas. Hasta ahora, todo lo que hago me da 8 archivos de parche, o comienza a darme los archivos de parche para cada confirmación en el historial de la sucursal, desde el principio de los tiempos. Utilicé git rebase --interactive para aplastar los commits, pero ahora todo lo que intento me da millones de parches desde el principio de los tiempos. ¿Qué estoy haciendo mal?

git format-patch master HEAD # yields zillions of patches, even though there''s # only one commit since master


Como ya sabes, un git format-patch -8 HEAD te dará ocho parches.

Si desea que sus 8 commits aparezcan como uno, y no le ooXABCDEFGH reescribir el historial de su rama ( ooXABCDEFGH ), podría:

git rebase -i // squash A, B, C, D, E ,F, G into H

o, y sería una solución mejor, reproduzca todas sus 8 confirmaciones de X (la confirmación antes de sus 8 commits) en una nueva rama

git branch delivery X git checkout delivery git merge --squash master git format-patch HEAD

De esta forma, solo tienes una confirmación en la rama "entrega", y representa todas tus últimas 8 confirmaciones


Esta es una adaptación de la respuesta de Adam Alexander, en caso de que sus cambios estén en la rama principal. Esto hace lo siguiente:

  • Crea una nueva rama desechable "tmpsquash" desde el punto que queremos (busque la clave SHA ejecutando "git --log" o con gitg. Seleccione la confirmación que desea que sea tmpsquash head, las confirmaciones posteriores al master serán el aplastado se compromete).
  • Combina los cambios de maestro a tmpsquash.
  • Confirma los cambios aplastados en tmpsquash.
  • Crea el parche con los commit aplastados.
  • Regresa a la rama principal

laura@rune:~/example (master)$ git branch tmpsquash ba3c498878054e25afc5e22e207d62eb40ff1f38 laura@rune:~/example (master)$ git checkout tmpsquash Switched to branch ''tmpsquash'' laura@rune:~/example (tmpsquash)$ git merge --squash master Updating ba3c498..40386b8 Fast-forward Squash commit -- not updating HEAD [snip, changed files] 11 files changed, 212 insertions(+), 59 deletions(-) laura@rune:~/example (tmpsquash)$ git commit -a -m "My squashed commits" [test2 6127e5c] My squashed commits 11 files changed, 212 insertions(+), 59 deletions(-) laura@rune:~/example (tmpsquash)$ git format-patch master 0001-My-squashed-commits.patch laura@rune:~/example (tmpsquash)$ git checkout master Switched to branch ''master'' laura@rune:~/example (master)$


Formato-parche entre dos etiquetas:

git checkout <source-tag> git checkout -b <tmpsquash> git merge --squash <target-tag> git commit -a -m "<message>" git format-patch <source-tag>


La forma más fácil es usar git diff y agregar git log si desea el mensaje de confirmación combinado que arrojará el método squash. Por ejemplo, para crear el parche entre commit abcd y 1234 :

git diff abcd..1234 > patch.diff git log abcd..1234 > patchmsg.txt

Luego, al aplicar el parche:

git apply patch.diff git add -A git reset patch.diff patchmsg.txt git commit -F patchmsg.txt

No olvide el argumento --binary a git diff cuando se trata de archivos que no son de texto, por ejemplo, imágenes o videos.


Recomiendo hacer esto en una rama de usar y tirar de la siguiente manera. Si tus confirmaciones están en la rama "nuevas líneas" y ya has cambiado a tu rama "maestra", esto debería ser el truco:

[adam@mbp2600 example (master)]$ git checkout -b tmpsquash Switched to a new branch "tmpsquash" [adam@mbp2600 example (tmpsquash)]$ git merge --squash newlines Updating 4d2de39..b6768b2 Fast forward Squash commit -- not updating HEAD test.txt | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) [adam@mbp2600 example (tmpsquash)]$ git commit -a -m "My squashed commits" [tmpsquash]: created 75b0a89: "My squashed commits" 1 files changed, 2 insertions(+), 0 deletions(-) [adam@mbp2600 example (tmpsquash)]$ git format-patch master 0001-My-squashed-commits.patch

¡Espero que esto ayude!


Siempre uso git diff para que en tu ejemplo, algo así como

git diff master > patch.txt


Solo para agregar una solución más al bote: si usa esto en su lugar:

git format-patch master --stdout > my_new_patch.diff

Luego, seguirán siendo 8 parches ... pero todos estarán en un solo archivo de parche y se aplicarán como uno con:

git am < my_new_patch.diff