Combinar varias confirmaciones antes de enviar en Git [duplicar]


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 commit antes de subir a un control remoto. ¿Cómo lo hago? Creo que rebase hace esto, pero no puedo darle sentido a los documentos.

Author: muudscope, 2011-08-04

8 answers

Lo que quieres hacer se conoce como "aplastar" en git. Hay muchas opciones cuando estás haciendo esto (¿demasiadas?) pero si solo quieres fusionar todos tus commits no publicados en un solo commit, 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 todo el 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 otro editor de texto se abrirá para permitirle combinar los mensajes de confirmación de todas las confirmaciones en un gran mensaje de confirmación.

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

 496
Author: Leopd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-25 21:28:50

Si tienes montones de confirmaciones y solo quieres aplastar las últimas X confirmaciones, busca el ID de confirmación de la confirmación desde la que quieres empezar a aplastar y haz

git rebase -i <that_commit_id>

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

 57
Author: Noich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-22 09:28:35

Hay bastantes respuestas de trabajo aquí, pero me pareció que esta es la más fácil. Este comando abrirá un editor, donde solo puede reemplazar pick con squash para eliminarlos / fusionarlos en uno

git rebase -i HEAD~4

Donde, 4 es el número de confirmaciones que desea squash en uno. Esto se explica aquí también.

 26
Author: vikas027,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-05 23:16:09

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

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. Puedes rechazar commits, aplastar commits en un solo commit, o editar commits 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

Http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html

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

 24
Author: Justin Weiss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-04 00:08:57

Se me ocurrió

#!/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 las líneas vacías del mensaje de confirmación. Uso esto para cambios locales en un wiki de github (usando gollum)

 10
Author: ruediste,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-27 20:55:56

Y mi forma de squashing múltiples push es (tal vez empujaste a tu propia rama muchos commits y ahora deseas hacer una pull request y no quieres saturarlos con muchos commits que ya has empujado). La forma en que lo hago (no hay otra opción más simple que yo pueda decir es).

  1. Cree una nueva rama por el bien de squash (rama desde la rama original a la que desea extraer la solicitud).
  2. Empuje la rama recién creada.
  3. Fusionar rama con commits (ya empujado) a la nueva rama.
  4. Rebase nueva rama y squash.
  5. Empuje nueva rama.
  6. Crea una nueva pull request para una nueva rama que ahora tiene un solo commit.

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 extraer la solicitud en from_branch_you_wish_to_pull_request_to

 5
Author: Tomer Ben David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-15 12:21:44

Puedes aplastar (unir) confirmaciones con un Rebase interactivo. Hay un bonito video de YouTube que muestra cómo hacer esto en la línea de comandos o con SmartGit :

Si ya eres un usuario de SmartGit entonces puedes seleccionar todas tus commits salientes (manteniendo presionada la tecla Ctrl) y abrir el menú contextual (clic derecho) para aplastar tus commits.

Es muy cómodo:

introduzca la descripción de la imagen aquí

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

 4
Author: Benny Neugebauer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-10 17:01:07

Probablemente quieras usar Rebase interactivo, que se describe en detalle en ese enlace.

Puedes encontrar otros buenos recursos si buscas "git rebase interactive".

 1
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-26 10:03:04