tab - git tag commits
Combinando mĂșltiples confirmaciones antes de presionar Git (8)
Esta pregunta ya tiene una respuesta aquí:
- Aplasta mis últimos X mensajes juntos usando Git 30 respuestas
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
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).
- Cree una nueva rama por el bien de la
squash
(rama de la rama original a la que desea solicitar). - Empuje la rama recién creada.
- Fusionar rama con confirmaciones (ya empujadas) a nueva rama.
- Rebase nueva rama y squash.
- Empuje nueva rama.
- 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)