Combinando múltiples confirmaciones antes de insertar Git [duplicado]
Tengo un montón de confirmaciones en mi repositorio local que son temáticamente similares. Me gustaría combinarlos en una única confirmación antes de pasar a un control remoto. ¿Cómo lo hago? Creo rebase
que hace esto, pero no puedo entender los documentos.
Lo que quieres hacer se denomina "aplastar" en git. Hay muchas opciones cuando haces esto (¿demasiadas?), pero si solo quieres fusionar todas tus confirmaciones no enviadas en una sola confirmación, haz esto:
git rebase -i origin/master
Esto abrirá su editor de texto ( -i
es para "interactivo") con un archivo similar a este:
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 todos los 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 que le permitirá combinar los mensajes de confirmación de todas las confirmaciones en un mensaje de confirmación grande.
¡Voilá! Buscar en Google "git squashing" le dará explicaciones de todas las demás opciones disponibles.
Si tiene muchas confirmaciones y solo desea aplastar las últimas X confirmaciones, busque el ID de la confirmación desde la cual desea comenzar a aplastar y haga
git rebase -i <that_commit_id>
Luego proceda como se describe en la respuesta de leopd, cambiando todos los pick
s a squash
es excepto el primero.
Ejemplo :
871adf OK, feature Z is fully implemented --- newer commit --┐
0c3317 Whoops, not yet... |
87871a I'm ready! |
643d0e Code cleanup |-- Join these into one
afb581 Fix this and that |
4e9baa Cool implementation |
d94e78 Prepare the workbench for feature Z -------------------┘
6394dc Feature Y --- older commit
Puedes hacer esto (escribe el número de confirmaciones):
git rebase --interactive HEAD~[7]
O esto (escribe el hash de la última confirmación que no deseas aplastar):
git rebase --interactive 6394dc
Hay bastantes respuestas funcionales aquí, pero esta me pareció la más fácil. Este comando abrirá un editor, donde puede simplemente reemplazarlos pick
para squash
eliminarlos/fusionarlos en uno solo.
git rebase -i HEAD~4
donde, 4
es la cantidad de confirmaciones que desea agrupar en una. Esto también se explica aquí .
Si está buscando squash
las confirmaciones que también incluyen la primera confirmación, utilice este comando
git rebase -i --root
Puedes hacer esto con git rebase -i
, pasando la revisión que deseas usar como 'raíz':
git rebase -i origin/master
abrirá una ventana de edición que muestra todas las confirmaciones que ha realizado después de la última confirmación en origin/master
. Puede rechazar confirmaciones, agrupar confirmaciones en una sola confirmación o editar confirmaciones anteriores.
Hay algunos recursos que probablemente puedan explicar esto mejor y mostrar algunos otros ejemplos:
http://book.git-scm.com/4_interactive_rebasing.html
y
http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html
Son las dos primeras páginas buenas que pude encontrar.
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. Lo uso para cambios locales en una wiki de github (usando gollum)