Cambiar el mensaje de confirmación de git después de la inserción (dado que nadie se retiró del control remoto)

983

He hecho un git commit y un empujón posterior. Me gustaría cambiar el mensaje de confirmación. Si lo entiendo correctamente, esto no es aconsejable porque alguien podría haberse retirado del repositorio remoto antes de realizar dichos cambios. ¿Qué pasa si sé que nadie ha tirado?

¿Hay alguna forma de hacer esto?

K_U
fuente
Que has intentado Suponiendo que ya sabe cómo cambiar el mensaje de confirmación, y luego intente y presione, Git le dirá lo que debe hacer para que esto suceda.
Andrew Marshall
1
Consulte la respuesta a la pregunta "¿Cómo edito un mensaje de confirmación incorrecto en git (lo he presionado)?" stackoverflow.com/a/457396/444639
Mike Rylander
44
Declarándolo - ¡Pregunta de Google de git commit Rank no 1!
Manish Shrivastava
Si modifica el commit HEAD y empuja generalmente (sin --force) entonces sorprendentemente no falla. El mensaje de confirmación HEAD se actualiza con el ID de confirmación modificado. Significa que otros ID de confirmación, excepto HEAD, permanecen intactos. Noté este comportamiento con la versión git 2.8.1.
irsis

Respuestas:

1375

Historia cambiante

Si es la confirmación más reciente, simplemente puede hacer esto:

git commit --amend

Esto abre el editor con el último mensaje de confirmación y le permite editar el mensaje. (Puede usar -msi desea borrar el mensaje anterior y usar uno nuevo).

Emprendedor

Y luego, cuando empujes, haz esto:

git push --force-with-lease <repository> <branch>

O puedes usar "+":

git push <repository> +<branch>

O puedes usar --force:

git push --force <repository> <branch>

Tenga cuidado al usar estos comandos.

  • Si alguien más empujó los cambios a la misma rama, probablemente desee evitar destruir esos cambios. La --force-with-leaseopción es la más segura, ya que abortará si hay algún cambio ascendente (

  • Si no especifica la rama explícitamente, Git usará la configuración de inserción predeterminada. Si su configuración de inserción predeterminada es "coincidente", puede destruir los cambios en varias ramas al mismo tiempo.

Tirar / buscar después

Cualquier persona que ya se haya retirado recibirá un mensaje de error, y deberá actualizar (suponiendo que ellos mismos no estén haciendo ningún cambio) haciendo algo como esto:

git fetch origin
git reset --hard origin/master # Loses local commits

Tenga cuidado al usar reset --hard. Si tiene cambios en la rama, esos cambios serán destruidos.

Una nota sobre la modificación del historial

Los datos destruidos son realmente solo el antiguo mensaje de confirmación, pero --forceno lo saben, y felizmente también eliminarán otros datos. Así que piense --forcecomo "Quiero destruir datos, y sé con certeza qué datos se están destruyendo". Pero cuando se confirman los datos destruidos, a menudo puede recuperar las confirmaciones antiguas del registro de datos: los datos se quedan huérfanos en lugar de destruidos (aunque las confirmaciones huérfanas se eliminan periódicamente).

Si no crees que estás destruyendo datos, aléjate de --force... podrían ocurrir cosas malas .

Por eso --force-with-leasees algo más seguro.

Dietrich Epp
fuente
13
Tenga cuidado con esa "solución", ya que si tienen algún compromiso local, no apresurado, se "perderán" ( perdieron de verdad a los huérfanos , pero recuperarlos no es obvio).
Andrew Marshall
1
probablemente desee especificar el nombre de la rama cuando presiona --force, de lo contrario puede presionar más de lo esperado.
user693960
1
@ user693960: Git solo empujará lo que configures para empujar.
Dietrich Epp
10
Simplemente git push --forcesin las opciones <repository> y <branch> también funciona, si tiene su configuración aguas arriba.
ahnbizcad
2
¿Puedes dar un ejemplo de <repository>? Es origin? org/repo? O simplemente repo?
MikeSchinkel
440

Sólo decir :

git commit --amend -m "New commit message"

y entonces

git push --force
Shrivastava Manish
fuente
8
En mi caso git push origin <BRANCH-NAME>no funcionó, tuve que usar git push --forcecomo se explica en la respuesta aceptada.
Gabriel
1
Esto no funciona para mí. nos tiene git push --force, o de lo contrario el empuje no pasa.
ahnbizcad
44
@ahnbizcad, debería funcionar. Solo asegúrese de que el nombre de la rama sea correcto.
William
3
¡Animo por la simplicidad en tu explicación! Lo uso con más frecuencia
Vasikos
3
Apliqué estos comandos con éxito solo después de "desproteger" temporalmente mi rama, lo que ocurrió en mi proyecto alojado en GitLab. Si tiene este problema, antes de aplicar estos comandos, consulte esta stackoverflow.com/a/32267118/1423345 para "desproteger" la rama, y ​​puede "protegerla" nuevamente después de terminar de enmendar el mensaje de confirmación :)
John
262

Para editar una confirmación que no sea la más reciente:

Paso 1 : git rebase -i HEAD~nhacer un rebase interactivo para los últimos ncommits afectados. (es decir, si desea cambiar un mensaje de confirmación 3 confirmaciones, hagagit rebase -i HEAD~3 )

git desplegará un editor para manejar esas confirmaciones, observe este comando:

#  r, reword = use commit, but edit the commit message

eso es exactamente lo que necesitamos!

Paso 2 : Cambie picka rlas confirmaciones que desea actualizar el mensaje. No se moleste en cambiar el mensaje de confirmación aquí, se ignorará. Lo harás en el siguiente paso. Guarda y cierra el editor.

Tenga en cuenta que si edita su 'plan' de rebase pero no comienza el proceso de permitirle cambiar el nombre de los archivos, ejecute:

git rebase --continue

Si desea cambiar el editor de texto utilizado para la sesión interactiva (por ejemplo, del vi predeterminado al nano), ejecute:

GIT_EDITOR=nano git rebase -i HEAD~n

Paso 3 : Git abrirá otro editor para cada revisión que coloques rantes. Actualice el mensaje de confirmación como desee, luego guarde y cierre el editor.

Paso 4 : Después de todos los commits se actualizan los mensajes. es posible que desee hacer git push -fpara actualizar el control remoto.

Jinsong Li
fuente
21
Esta respuesta debe aceptarse, ya que ofrece la posibilidad de cambiar otras confirmaciones que la confirmación más reciente, a diferencia de la respuesta aceptada. Salvaste mi día. ¡Gracias!
xZero
1
Elija n = 3 para los últimos 3 commits:git rebase -i HEAD~3
HeikoS
Si edita su 'plan' de rebase aún no comienza el proceso de permitirle cambiar el nombre de los archivos, ejecute git rebase --continue. Y si desea cambiar el editor de texto utilizado para la sesión interactiva (por ejemplo, de forma predeterminada via nano), ejecute GIT_EDITOR=nano git rebase -i HEAD~n.
Jamie Birch
Edité esto para agregar un poco más de información. Por favor echa un vistazo. Esta fue la respuesta a lo que quería hacer, pero me desplacé porque no tenía el encabezado.
Kip
Hice una edición sugerida para poner el comentario útil de @JamieBirch en la respuesta, es posible que desee revisar.
Notts90 apoya a Monica el
44

Use estos dos pasos en la consola:

git commit --amend -m "new commit message"

y entonces

git push -f

Hecho :)

Abdul Rizwan
fuente
Thx: ¿Son esos pasos solo para enmendar el último comentario o también se pueden usar para comentarios anteriores?
Jay
@ Jay perdón por la respuesta tardía, estos pasos solo para enmendar el último mensaje de confirmación.
Abdul Rizwan
19

Cabe señalar que si usa push --forcecon múltiples referencias, TODOS serán modificados como resultado. Asegúrese de prestar atención a dónde está configurado su repositorio de git para empujar. Afortunadamente, hay una manera de salvaguardar un poco el proceso, especificando una única rama para actualizar. Lea las páginas de manual de git:

Tenga en cuenta que --force se aplica a todas las referencias que se envían, por lo tanto, se usa con push.default configurado para que coincida o con múltiples destinos de inserción configurados con remoto. *. Push puede sobrescribir referencias que no sean la rama actual (incluidas las referencias locales que son estrictamente detrás de su contraparte remota). Para forzar un empuje a una sola rama, use un + delante de la especificación de referencia para empujar (por ejemplo, git push origin + master para forzar un empuje a la rama maestra).

Steve Benner
fuente
3
Nota muy importante
peterh - Restablecer Monica
ninguna de las respuestas de fuerza funciona para mí, porque no tengo permisos ForcePush en el servidor. En cambio, quiero realizar una confirmación que cambia un mensaje de confirmación anterior. Podría escribir "mensaje de confirmación cambiado" en la sección de comentarios de esa confirmación.
nurettin
11

Si desea modificar una confirmación anterior, no la última, deberá usar el rebasecomando como se explica aquí , en la página de ayuda de Github , en la sección Modificación del mensaje de mensajes anteriores o de confirmación múltiple.

Carlos
fuente
11

Comando 1 .

git commit --amend -m "New and correct message"

Entonces,

Comando 2 .

git push origin --force
Teo Choong Ping
fuente
8
git commit --amend

luego edite y cambie el mensaje en la ventana actual. Después de eso haz

git push --force-with-lease
Beu
fuente
2

Otra opción es crear un "compromiso de erratas" adicional (y empujar) que haga referencia al objeto de compromiso que contiene el error; el nuevo compromiso de erratas también proporciona la corrección. Una confirmación de errata es una confirmación sin cambios sustanciales de código pero con un mensaje de confirmación importante; por ejemplo, agregue un carácter de espacio a su archivo readme y confirme ese cambio con el mensaje de confirmación importante, o use la opción git--allow-empty . Ciertamente es más fácil y seguro que el rebase, no modifica el historial verdadero y mantiene limpio el árbol de la rama (usandoamendtambién es una buena opción si está corrigiendo la confirmación más reciente, pero una confirmación de erratas puede ser una buena opción para las confirmaciones anteriores). Este tipo de cosas rara vez sucede que simplemente documentar el error es lo suficientemente bueno. En el futuro, si necesita buscar en un registro git una palabra clave de función, la confirmación original (errónea) puede no aparecer porque se utilizó la palabra clave incorrecta en esa confirmación original (el error tipográfico original); sin embargo, la palabra clave aparecerá en la confirmación de erratas que luego te indicará la confirmación original que tenía el error tipográfico. Aquí hay un ejemplo:

$ git log
commit 0c28141c68adae276840f17ccd4766542c33cf1d
Autor: Primero Último 
Fecha: miércoles 8 de agosto 15:55:52 2018 -0600

    Errata cometer:
    Este commit no tiene un cambio sustancial de código.
    Esta confirmación se proporciona solo para documentar una corrección a un mensaje de confirmación anterior.
    Esto pertenece al objeto de confirmación e083a7abd8deb5776cb304fa13731a4182a24be1
    Mensaje de confirmación incorrecto original:
        Se cambió el color de fondo a rojo.
    Corrección (* cambio resaltado *):
        Se cambió el color de fondo a * azul *

commit 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4
Autor: Primero Último 
Fecha: miércoles 8 de agosto 15:43:16 2018 -0600

    Algún mensaje de confirmación provisional

commit e083a7abd8deb5776cb304fa13731a4182a24be1
Autor: Primero Último 
Fecha: miércoles 8 de agosto 13:31:32 2018 -0600

    Se cambió el color de fondo a rojo.
rob_7cc
fuente
Rob, esto parece prometedor. ¿Puede mostrar los comandos necesarios para hacer una "confirmación de erratas"? solo esta publicación aparece en google en estos términos.
Jim
1
Una "confirmación de errata" es simplemente una confirmación normal con un mensaje que hace referencia a la confirmación errónea anterior, documentando y proporcionando una corrección por el error anterior. git commit -m “fixed feature A”(Supongamos que git le da a este un ID de confirmación de e3ab7312 ... ... (luego se da cuenta de que su mensaje era incorrecto, así que ahora realice un cambio sin consecuencias en un archivo, como agregar un espacio al archivo léame, o use la —allow-emptyopción git). .. git commit -m “Errata commit for previous commit e3ab7312... original message should have been ‘fixed feature *B*’'' '
rob_7cc
1
... si luego necesita buscar en el registro de git referencias a la "característica B", se mostrará la confirmación de erratas, pero el mensaje de confirmación de erratas contiene una referencia al ID de confirmación original que proporciona una trazabilidad completa. Por cierto, el término "confirmación de errata" no es nada especial (no hay comando ni opción de "errata" en git) ... es solo mi terminología para una confirmación normal que proporciona una corrección a una confirmación previa que tenía un error / error tipográfico.
rob_7cc
Rob, eso funcionó muy bien. Pude agregar una nueva confirmación vacía con la descripción correcta, que apunta a la confirmación original, utilizando el SHA. ahora, ambos se muestran en mi 'cadena git' para los módulos. ¡Gracias!
Jim
Me alegra que te haya funcionado. Utilizo la misma técnica para corregir errores en los mensajes de confirmación. Como alternativa, recientemente descubrí que git notes esto serviría para el mismo propósito que un "compromiso de erratas". Simplemente agregue una nota a una confirmación anterior para anotar o corregir cualquier error en el mensaje de confirmación: https://git-scm.com/docs/git-notes
rob_7cc
0

Esto me funciona bastante bien,

origen / nombre de sucursal de git checkout

si ya estás en la sucursal, entonces es mejor hacer pull o rebase

git pull

o

git -c core.quotepath=false fetch origin --progress --prune

Luego puedes simplemente usar

git commit --amend -m "Your message here"

o si desea abrir el editor de texto, use

git commit --amend

Preferiré usar el editor de texto si tienes muchos comentarios. Puede configurar su editor de texto preferido con el comando

git config --global core.editor your_preffered_editor_here

De todos modos, cuando haya terminado de cambiar el mensaje de confirmación, guárdelo y salga

y luego correr

git push --force

Y tu estas listo

Hasasn
fuente
0

información adicional para el mismo problema si está utilizando una tubería de bitbucket

edita tu mensaje

git commit --amend

empujar al servidor

git push --force <repository> <branch>

luego agregue --force a su comando push en la tubería

git ftp push --force

Esto eliminará sus confirmaciones anteriores y empujará la actual.

eliminar la fuerza después del primer empuje

Lo probé en la tubería Bitbucket y funciona bien

Abdallah Awwad Alkhwaldah
fuente