Git: edite solo mensajes de confirmaciones anteriores

12

Por razones flojas, introduje un montón de confirmaciones con mensajes predeterminados y ahora se ha vuelto engorroso, ya que no sé realmente qué he cambiado en cada confirmación.

¿Cómo edito solo los mensajes de confirmaciones anteriores y (si es posible) mantengo el árbol de confirmaciones?

Tuyen Pham
fuente
10
¡Cuidado con cambiar la historia pública!
D. Ben Knoble
2
Me temo que las respuestas aquí no te dan advertencias lo suficientemente graves. este será crear un gran lío si alguien más ha tirado su historial en el ínterin - todo el Moreso si han cometido un nuevo trabajo sobre la parte superior de la misma!
Eevee
Lo usaré con causa, tengo un caso más simple aquí, soy el único que usa este repositorio.
Tuyen Pham
3
Información: Esto ya se ha preguntado (posiblemente muchas veces) en Stack Overflow .
usuario202729

Respuestas:

20

Para editar los mensajes de confirmación de una serie de confirmaciones, ejecuto

git rebase -i firstsha

donde firstshaes un identificador para la confirmación principal de la primera confirmación que quiero editar. (Puede usar cualquier referencia válida aquí, por git rebase -i HEAD~4lo que mostrará las últimas cuatro confirmaciones).

En el editor que se abre, cambie todas las entradas "pick" a "reword" en los commits que desea modificar, luego cierre el editor; luego se le pedirá que ingrese mensajes de confirmación para todas las confirmaciones que eligió.

Tenga en cuenta que esto va a cambiar el árbol de cometer, porque los hashes de las confirmaciones van a cambiar. Tendrá que forzar a empujar su nuevo árbol, o empujarlo a una nueva rama. También desordenará las fusiones, así que evite editar confirmaciones de fusión.

Para editar rápidamente solo la última confirmación, ejecute

git commit --amend

(Pero ten cuidado con cualquier cosa puesta en escena para commit).

Stephen Kitt
fuente
¿Cómo afectaría el árbol de confirmación? ¿Creará una línea vertical intermedia en el árbol de confirmación? Ahora solo tenía un árbol de confirmación de línea vertical y es necesario cambiar más de 100 mensajes.
Tuyen Pham
3
No creará una nueva "línea" en su árbol de confirmación, cambiará todas las confirmaciones. Si su historial es actualmente lineal, seguirá siendo lineal.
Stephen Kitt
Depende. ¿Lo estás usando solo y no estás empujando a un servidor? Entonces no, solo una "línea". Pero de lo contrario, puede haber dos, y en base a sus respuestas a las dos primeras, podemos ayudarlo a deshacerse de la vieja "línea".
Capitán Man
1
Rebase tiene una bandera para manejar fusiones (creo que es preserve-merges)
D. Ben Knoble
6

Lo que estás buscando es git rebase.

Si solo desea cambiar el git commitmensaje anterior , solo necesita usar lo siguiente:

git commit --amend

Y realice los cambios que desee en la confirmación anterior y luego guarde las ediciones.

Sin embargo, si necesita cambiar las confirmaciones anteriores, debe usarlas rebase.

git rebase -i HEAD~N 

donde N es igual al número de confirmaciones a las que desea volver, por ejemplo, 2, 12 o 6, etc., etc.

Aquí debe obtener un editor de texto con sus confirmaciones. Cambie la opción de picka rewordpara cambiar el mensaje.

Una vez que haya identificado todas las confirmaciones que desea cambiar y haya cambiado adecuadamente sus opciones, guarde y cierre el editor. Luego realice los cambios en cada mensaje de confirmación. Una vez que esté satisfecho, puede ejecutar:

git push --force

Y debería haber mantenido su historial de git aunque con diferentes valores hash porque ha realizado los cambios necesarios que desea. Aquí hay algunos enlaces adicionales que debe consultar:

7.6 Herramientas de Git - Reescritura del historial
Ayuda de GitHub - Cambio de un mensaje de
confirmación StackOverflow - Pregunta sobre cómo cambiar mensajes de confirmación antiguos

kemotep
fuente
Si "reformula", no necesita " commit --amend", a menos que arruine el proceso de confirmación de alguna manera.
Stephen Kitt
Gracias, aquí los pasos que haré según lo que entiendo de su publicación: 1. haga git rebase -i firstshaeso firstshaes el hash del compromiso de los padres del compromiso al que me gustaría cambiar el mensaje, luego en el editor, cambie picka reword, entermensaje nuevo, luego emita git rebase --continuey hacer git push --force?
Tuyen Pham
@StephenKitt, acabo de notar tu respuesta, estaba haciendo la mía cuando enviaste la tuya. Seguiré tu consejo y buscaré hacer esas ediciones. Si es más apropiado, puedo combinar mi respuesta con la tuya agregando los enlaces a la tuya si crees que sería mejor para esta pregunta que tener múltiples respuestas similares.
kemotep
@TuyenPham solo necesita hacer que git rebase -i HEAD~NN sea el número de confirmaciones que desea realizar. Cambie todas las opciones de confirmación de las que desea editar el mensaje de picka reword, guarde este archivo, realice los cambios en cada uno de esos archivos de confirmación y guárdelos. Una vez que esté seguro de haber terminado, solo necesita git push --force [Name of git branch you are were working on]. Siempre puede regresar y hacer esto nuevamente o hacerlo por etapas.
kemotep