tag tab remove practices crear commits commands best git git-squash

tab - git tag commits



Combinando mĂșltiples confirmaciones antes de presionar Git (8)

Esta pregunta ya tiene una respuesta aquí:

Tengo un montón de confirmaciones en mi repositorio local que son temáticamente similares. Me gustaría combinarlos en un solo compromiso antes de subir a un control remoto. ¿Cómo lo hago? Creo que rebase hace esto, pero no puedo entender los documentos.


Hay bastantes respuestas de trabajo aquí, pero encontré esto más fácil. Este comando abrirá un editor, en el que simplemente puede reemplazar pick con squash para eliminarlos / fusionarlos en uno.

git rebase -i HEAD~4

donde, 4 es el número de confirmaciones que quieres aplastar en una. Esto se explica here también.


Lo que quieres hacer se conoce como "aplastar" en git. Hay muchas opciones cuando estás haciendo esto (¿demasiadas?) Pero si solo deseas combinar todas tus confirmaciones no presionadas en una única confirmación, haz esto:

git rebase -i origin/master

Esto abrirá su editor de texto ( -i es para "interactivo") con un archivo que se ve así:

pick 16b5fcc Code in, tests not passing pick c964dea Getting closer pick 06cf8ee Something changed pick 396b4a3 Tests pass pick 9be7fdb Better comments pick 7dba9cb All done

Cambie toda la pick a squash (o s ) excepto el primero:

pick 16b5fcc Code in, tests not passing squash c964dea Getting closer squash 06cf8ee Something changed squash 396b4a3 Tests pass squash 9be7fdb Better comments squash 7dba9cb All done

Guarde su archivo y salga de su editor. Luego se abrirá otro editor de texto para permitirle combinar los mensajes de confirmación de todas las confirmaciones en un mensaje de confirmación grande.

Voila! Googlear "git squashing" te dará explicaciones de todas las otras opciones disponibles.


Probablemente desee utilizar la función Rebasar interactivo , que se describe detalladamente en ese enlace.

Puede buscar otros buenos recursos si busca "git rebase interactivo".


Puede hacer esto con git rebase -i , pasando la revisión que desea usar como ''raíz'':

git rebase -i origin/master

abrirá una ventana del editor que muestra todas las confirmaciones que ha realizado después de la última confirmación en origin/master . Puede rechazar confirmaciones, hacer squash en una única confirmación o editar confirmaciones anteriores.

Hay algunos recursos que probablemente pueden explicar esto de una mejor manera, y mostrar algunos otros ejemplos:

http://book.git-scm.com/4_interactive_rebasing.html

y

here

Son las dos primeras páginas buenas que pude encontrar.


Puedes aplastar (unir) los compromisos con una Rebase interactiva . Hay un video de YouTube bastante bueno que muestra cómo hacer esto en la línea de comandos o con SmartGit :

Si ya es usuario de SmartGit, puede seleccionar todas sus confirmaciones salientes (manteniendo presionada la tecla Ctrl) y abrir el menú contextual (clic derecho) para aplastar sus confirmaciones.

Es muy comodo:

También hay un tutorial muy bueno de Atlassian que muestra cómo funciona:


Si tiene muchas confirmaciones y solo desea aplastar las últimas X confirmaciones, busque la ID de confirmación de la confirmación desde la que desea comenzar a aplastar y haga

git rebase -i <that_commit_id>

Luego proceda como se describe en la respuesta de leopd, cambiando todas las pick a squash excepto la primera.


Y mi forma de squashing push múltiple es (tal vez presionó a su propia rama muchas confirmaciones y ahora desea hacer una solicitud de extracción y no quiere abarrotarlas con muchas confirmaciones que ya ha presionado). La forma en que lo hago (no hay otra opción más simple por lo que puedo decir).

  1. Cree una nueva rama por el bien de la squash (rama de la rama original a la que desea solicitar).
  2. Empuje la rama recién creada.
  3. Fusionar rama con confirmaciones (ya empujadas) a nueva rama.
  4. Rebase nueva rama y squash.
  5. Empuje nueva rama.
  6. Crear una nueva solicitud de extracción para una nueva rama que ahora tiene un solo compromiso.

Ejemplo:

git checkout from_branch_you_wish_to_pull_request_to git checkout -b new_branch_will_have_single_squashed_commit git push -u new_branch_will_have_single_squashed_commit git merge older_branch_with_all_those_multiple_commits git rebase -i (here you squash) git push origin new_branch_will_have_single_squashed_commit

Ahora puede arrastrar la solicitud desde from_branch_you_wish_to_pull_request_to


se me ocurrio

#!/bin/sh message=`git log --format=%B origin..HEAD | sort | uniq | grep -v ''^$''` git reset --soft origin git commit -m "$message"

Combina, ordena, unifica y elimina líneas vacías del mensaje de confirmación. Uso esto para cambios locales en un wiki de github (usando gollum)