27 Pregunta: ¿Cómo modificar los mensajes de compromiso existentes, sin pulir?

pregunta creada en Thu, May 2, 2019 12:00 AM

Escribí lo incorrecto en un mensaje de confirmación.

¿Cómo puedo cambiar el mensaje? El compromiso aún no se ha empujado.

    
7672
  1. Para aquellos algo nuevos para git: el punto de Laurie sobre no haber empujado aún es importante. Como rebasar, esto está cambiando la historia. Si alguien ha clonado /extraído de su repositorio entre el historial original y reescrito, no podrá extraer después de la reescritura (para esa rama).
    2008-10-10 20: 12: 17Z
27 Respuestas                              27                         

Modificando el mensaje de confirmación más reciente

 
git commit --amend

abrirá su editor, permitiéndole cambiar el mensaje de confirmación de la confirmación más reciente. Además, puede establecer el mensaje de confirmación directamente en la línea de comandos con:

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

... sin embargo, esto puede hacer que los mensajes de confirmación de varias líneas o pequeñas correcciones sean más difíciles de ingresar.

Asegúrese de que no tiene ningún cambio de copia de trabajo en escena antes de hacer esto o se comprometerán también. (No se confirmarán los cambios Unstaged .)

Cambiando el mensaje de una confirmación que ya ha enviado a su sucursal remota

Si ya ha enviado su compromiso a su sucursal remota, entonces debe forzar el empuje del commit con:

 
git push <remote> <branch> --force
# Or
git push <remote> <branch> -f

Advertencia: el empuje forzado sobrescribirá la rama remota con el estado de la local . Si hay confirmaciones en la rama remota que no tiene en su sucursal local, perderá esas confirmaciones.

Advertencia: tenga cuidado al modificar las confirmaciones que ya ha compartido con otras personas. La modificación de las confirmaciones reescribe para que tengan SHA ID, lo que plantea un problema si otras personas tienen copias del antiguo compromiso que ha reescrito. Cualquier persona que tenga una copia del compromiso anterior tendrá que sincronizar su trabajo con su nuevo compromiso reescrito, lo que a veces puede ser difícil, así que asegúrese de coordinar con otros cuando intente reescribir el historial de confirmaciones compartidas, o simplemente evite volver a escribir confirmaciones compartidas en conjunto.


Usar rebase interactivo

Otra opción es usar rebase interactiva.
Esto le permite editar cualquier mensaje que desee actualizar, incluso si no es el último mensaje.

Para hacer un git squash, sigue estos pasos:

 
// X is the number of commits to the last commit you want to be able to edit
git rebase -i HEAD~X

Una vez que aplastes tus compromisos, elige el e/r para editar el mensaje

 introduce la descripción de la imagen aquí

Nota importante sobre rebase interactivo

Cuando usa el git rebase -i HEAD~X puede haber más que X confirmaciones. Git "recopilará" todos los confirmaciones en las últimas X confirmaciones y si hubo una fusión en algún lugar entre ese rango, también verás todas las confirmaciones para que el resultado sea X +.

Buen consejo:

Si tiene que hacerlo por más de una rama y podría tener conflictos al modificar el contenido, configure git rerere y deja que git resuelva esos conflictos automáticamente por ti.


Documentación

15372
2019-01-25 15: 17: 31Z
  1. Sin embargo, git commit --amend no es tan poderoso como git rebase -i.
    2010-07-05 08: 40: 35Z
  2. @ jeffjose, definitivamente no es necesario. Además, git commit --amend puede arreglar el compromiso maestro (a?).
    2010-07-14 06: 02: 30Z
  3. Si ya presionaste, solo fuerza la pulsación otra vez: git push -f origin branchname
    2012-05-02 14: 12: 24Z
  4. @ hughes no es git push -f un poco peligroso si otras personas usan el mismo repositorio.
    2012-11-08 07: 48: 41Z
  5. Si no desea volver a escribir todo el mensaje de confirmación, vaya a git commit --amend -c HEAD. Esto abrirá el editor rellenado previamente con su antiguo mensaje de confirmación, para que pueda cambiarlo.
    2012-11-14 15: 38: 10Z
 
git commit --amend -m "your new message"
    
2461
2016-03-01 18: 19: 29Z
  1. Hice git commit --amend -m "New message", pero al presionar a Github se generó el mensaje "Combinar los cambios remotos antes de presionar nuevamente". Después de tirar, cometer - enmendar y presionar nuevamente, el nuevo mensaje no aparecerá. En lugar de eso, tengo "Fusionar 'maestro' de github.com :[myrepo]"
    2011-10-14 16: 58: 32Z
  2. @ DaveEveritt, es muy probable que hayas enviado tu compromiso corriente arriba antes de intentar solucionarlo.
    2013-04-25 08: 21: 20Z
  3. @ Kyralessa no es cierto. En bash, puede redactar fácilmente mensajes de confirmación multilínea simplemente no cerrando la cotización hasta que haya terminado (presionando retorno al final de cada línea dentro de las comillas).
    2013-06-11 21: 11: 57Z
  4. No entiendo cómo una respuesta que se parece mucho a la idea principal de una respuesta escrita hace dos años y que la respuesta aceptada recibe tantos votos. . Extraño. (no hay nada malo con la respuesta)
    2014-01-15 05: 30: 22Z
  5. @ AmalMurali, bueno. Mi punto no fue tanto sobre la popularidad de la pregunta, como sobre la utilidad de la respuesta. Pero esta respuesta en particular no es la respuesta más antigua, ni ofrece ninguna información adicional sobre la respuesta aceptada. Parece ser una copia de una sección de la respuesta aceptada. Ese fue mi punto. CHEERS!
    2014-05-21 20: 16: 23Z

Si la confirmación que desea corregir no es la más reciente:

  1. git rebase --interactive $parent_of_flawed_commit

    Si desea corregir varias confirmaciones defectuosas, pase el padre de la más antigua de ellas.

  2. Aparecerá un editor, con una lista de todas las confirmaciones desde la que hiciste.

    1. Cambie pick a reword (o en versiones anteriores de Git, a edit) delante de cualquier confirmación que desee corregir.
    2. Una vez que guarde, Git volverá a reproducir las confirmaciones enumeradas.

  3. Para cada confirmación que quieras reformular , Git te devolverá a tu editor. Para cada confirmación que quieras editar , Git te deja en el shell. Si estás en el shell:

    1. Cambie la confirmación de la forma que desee.
    2. git commit --amend
    3. git rebase --continue

La mayor parte de esta secuencia se te explicará mediante la salida de los diversos comandos a medida que avanzas. Es muy fácil, no es necesario que lo memorice, solo recuerde que git rebase --interactive le permite corregir las confirmaciones sin importar cuánto tiempo pasaron.


Tenga en cuenta que no querrá cambiar las confirmaciones que ya haya enviado. O tal vez lo haga, pero en ese caso tendrá que tener mucho cuidado para comunicarse con todas las personas que pueden haber hecho sus compromisos y haber realizado un trabajo por encima de ellos. ¿Cómo recupero /resincronizo después de que alguien empuja una rebase o una reset a una rama publicada?

    
2336
2017-05-23 12: 02: 48Z
  1. ¿Se puede cambiar el mensaje de la primera confirmación (que no tiene un padre)?
    2010-01-21 19: 57: 18Z
  2. Esto se menciona en una de las otras respuestas, pero pondré una nota aquí. Desde git 1.6.6 puede usar reword en lugar de pick para editar el mensaje de registro.
    2010-05-31 13: 27: 57Z
  3. Por cierto, $parent_of_flawed_commit es equivalente a $flawed_commit^.
    2010-11-28 23: 26: 12Z
  4. ¡NUNCA HAGAS esto (o rebase en general) si ya has subido la carga!
    2011-05-31 19: 14: 04Z
  5. Use -p (--preserve-merges) si hubo una fusión después de la confirmación errónea.
    2012-01-31 14: 37: 47Z

Para enmendar la confirmación anterior, realice los cambios que desee y realice esas modificaciones, y luego ejecútelos  

git commit --amend

Esto abrirá un archivo en su editor de texto que representa su nuevo mensaje de confirmación. Comienza rellenado con el texto de su antiguo mensaje de confirmación. Cambie el mensaje de confirmación que desee, luego guarde el archivo y salga de su editor para finalizar.

Para modificar la confirmación anterior y mantener el mismo mensaje de registro, ejecute

 
git commit --amend -C HEAD

Para corregir la confirmación anterior eliminándola por completo, ejecute

 
git reset --hard HEAD^

Si desea editar más de un mensaje de confirmación, ejecute

 
git rebase -i HEAD~commit_count

(Reemplace commit_count con el número de confirmaciones que desea editar.) Este comando inicia su editor. Marque la primera confirmación (la que desea cambiar) como "editar" en lugar de "elegir", luego guarde y salga de su editor. Realice el cambio que desea confirmar y luego ejecute

 
git commit --amend
git rebase --continue

Nota: puede "Hacer el cambio que desee" también desde el editor abierto por git commit --amend

    
762
2014-10-24 10: 20: 01Z
  1. git rebase -i HEAD~commit_count también le permitirá cambiar los mensajes de confirmación de la cantidad de confirmaciones que elija. Simplemente marque las confirmaciones elegidas como "reword" en lugar de "pick".
    2013-08-21 20: 21: 59Z
  2. ¿Qué sucede si no desea realizar una rebase? ¿Quieres cambiar un mensaje anterior?
    2016-04-21 08: 56: 35Z
  3. git reset --hard aniquila los cambios no confirmados. Por favor, reemplace --hard con --soft.
    2018-02-28 17: 44: 56Z

Como ya se mencionó, git commit --amend es la manera de sobrescribir la última confirmación. Una nota: si desea también sobrescribir los archivos , el comando sería

 
git commit -a --amend -m "My new commit message"
    
392
2014-02-23 23: 10: 08Z
  1. Y si no quieres agregar todo, primero puedes hacer git add file.ext y luego solo git commit --amend
    2015-09-22 05: 56: 35Z

También puedes usar git filter-branch para eso.

 
git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD

No es tan fácil como un git commit --amend trivial, pero es especialmente útil si ya tiene algunas combinaciones después de su mensaje de confirmación erróneo.

Tenga en cuenta que esto intentará reescribir CADA compromiso entren HEAD y la confirmación defectuosa, por lo que debe elegir su comando msg-filter muy sabio ;-)

    
352
2014-05-21 02: 37: 16Z
  1. ¿Existe una versión de esto que no cambie la confirmación si la expresión regular no encuentra nada?
    2013-03-28 20: 08: 13Z
  2. AFAIK filter-branch --msg-filter generará nuevas confirmaciones en cualquier caso. Sin embargo, puede verificar dentro del msg-filter, si el sed tuvo éxito y utilizar esta información cuando finalice la operación de la rama de filtro para restablecer su árbol a refs /original.
    2013-03-29 16: 16: 25Z
  3. @ DavidHogue Esto solo es cierto cuando se usa el método de filtrar filtro. Los ID de confirmación que siguen a una confirmación modificada no cambian si utiliza el rebase interactivo.
    2013-07-06 19: 08: 37Z
  4. @ Marque Sí, es necesario. Los ID de confirmación dependen de las confirmaciones anteriores. Si no cambiaran, git sería inútil.
    2014-01-11 04: 45: 27Z
  5. Necesita $flawed_commit^..HEAD, no $flawed_commit..HEAD. como se indica en la página del manual: « El comando solo volverá a escribir los refs positivos mencionados en la línea de comandos (por ejemplo, si pasa a..b, solo se reescribirá b). »
    2014-07-29 11: 18: 49Z

Prefiero esta manera.

 
git commit --amend -c <commit ID>

De lo contrario, habrá una nueva confirmación con un nuevo ID de confirmación

    
311
2013-01-10 14: 23: 28Z
  1. Para mí, usar el comando anterior crea una nueva confirmación con un nuevo ID de confirmación más una confirmación adicional que dice "fusionar rama" como mensaje de confirmación predeterminado.
    2013-03-29 16: 27: 38Z
  2. Al enmendar siempre se crea un nuevo commit con un nuevo ID de commit. El ID de confirmación es el hash SHA del contenido de la confirmación, incluido el mensaje de confirmación y las marcas de tiempo creadas /confirmadas. Esta es una característica de Git que, salvo colisiones de hash, garantiza que dos confirmaciones con la misma ID sean exactamente las mismas, con exactamente el mismo contenido, historial, etc.
    2013-06-19 09: 30: 11Z
  3. De acuerdo con Emil. Además, al leer los documentos, parece que todo lo que hace "-c" es decirle a git qué mensaje de confirmación usar como la plantilla /predeterminada para su nueva confirmación ... Realmente ya va a hacer "-c < commit ID >" de forma predeterminada, por lo que no es necesario especificarlo.
    2013-09-29 19: 12: 37Z
  4. El -c hace algunas cosas. Utiliza el mensaje antiguo de forma predeterminada, pero también copia la información de autoría (persona y hora). -C hace lo mismo, excepto que no le pide que edite el mensaje.
    2014-12-28 02: 55: 53Z
  5. Como @SantanuDey, no me funcionó. Tengo fatal: Option -m cannot be combined with -c/-C/-F/--fixup.
    2015-04-14 05: 22: 17Z

Si está utilizando la herramienta Git GUI, hay un botón llamado enmendar la última confirmación. Haga clic en ese botón y luego mostrará sus últimos archivos y mensajes de confirmación. Simplemente edite ese mensaje y puede enviarlo con un nuevo mensaje de confirmación.

O use este comando desde una consola /terminal:

 
git commit -a --amend -m "My new commit message"
    
310
2017-02-26 16: 48: 31Z
  1. Esta respuesta es literalmente idéntica a esta el más antiguo . ¿Ha verificado las respuestas existentes antes de proporcionar otra?
    2019-05-02 01: 15: 38Z

Puedes usar Git rebasing . Por ejemplo, si desea volver a modificar para confirmar bbc643cd, ejecute

 
$ git rebase bbc643cd^ --interactive

En el editor predeterminado, modifique 'elegir' para 'editar' en la línea cuyo compromiso desea modificar. Realice sus cambios y luego escápelos con

 
$ git add <filepattern>

Ahora puedes usar

 
$ git commit --amend

para modificar la confirmación, y después de eso

 
$ git rebase --continue

para volver a la confirmación anterior.

    
283
2013-03-16 09: 39: 44Z
  1. Si desea asegurarse de que su cambio desde el git commit --amend se haya implementado, puede usar el git show y mostrará el nuevo mensaje.
    2013-02-19 20: 12: 44Z
  1. Si solo desea modificar su último mensaje de confirmación, haga lo siguiente:

     
    git commit --amend
    

    Eso te llevará a tu operador de texto y te permitirá cambiar el último mensaje de confirmación.

  2. Si desea cambiar los últimos 3 mensajes de confirmación, o cualquiera de los mensajes de confirmación hasta ese momento, suministre HEAD~3 al comando git rebase -i:

     
    git rebase -i HEAD~3
    
276
2014-05-21 02: 38: 25Z
  1. Esta respuesta anterior ya dice que puedes usar git commit --amend, y también dice que puedes usar git rebase -i HEAD~commit_count, todo lo que hiciste fue conectar 3 para commit_count.
    2014-07-23 12: 21: 05Z
  2. También votados a la baja. La gente simplemente no se molesta en leer las respuestas existentes .
    2019-05-02 01: 16: 22Z

    Si tiene que cambiar un mensaje de confirmación anterior en varias sucursales (es decir, la confirmación con el mensaje erróneo está presente en varias sucursales) es posible que desee utilizar:

     
    git filter-branch -f --msg-filter \
    'sed "s/<old message>/<new message>/g"' -- --all
    

    Git creará un directorio temporal para volver a escribir y, además, hará una copia de seguridad de las referencias antiguas en refs/original/.

    • -f forzará la ejecución de la operación. Esto es necesario si el directorio temporal ya está presente o si ya hay referencias almacenadas en refs/original. Si ese no es el caso, puede quitar esta bandera.

    • -- separa las opciones de rama de filtro de las opciones de revisión.

    • --all se asegurará de que todas las ramas y etiquetas se hayan reescrito.

    Debido a la copia de seguridad de sus referencias anteriores, puede volver fácilmente al estado antes de ejecutar el comando.

    Diga, desea recuperar su maestro y acceder a él en la rama old_master:

     
    git checkout -b old_master refs/original/refs/heads/master
    
        
    259
    2014-05-21 02: 39: 54Z
    1. Esta respuesta no responde a la pregunta del OP, ya que están puramente interesados ​​en corregir un compromiso que acaban de hacer. Regularmente uso git commit --amend para arreglar comentarios o agregar archivos. Olvidé git add, pero solo alguna vez antes de tener git push ed. También uso git filter-branch cuando quiero meterme por completo con el historial de versiones, pero el OP no quiere esto, por lo que esta respuesta necesita una gran advertencia de salud: ¡no intentes esto en casa, píos!
      2013-06-29 03: 17: 38Z

    Utilizar

     
    git commit --amend
    

    Para entenderlo en detalle, una excelente publicación es 4. Reescribiendo el historial de Git . También habla de cuándo no se debe utilizar git commit --amend.

        
    223
    2018-05-22 19: 46: 06Z
    1. ¿Hay una buena manera de corregir los mensajes de confirmación ya enviados a un repositorio público? Hasta el momento, he llegado a la conclusión de que, una vez presionados, mis errores tipográficos de mensajes de confirmación y mis pensamientos tienen que vivir para siempre.
      2013-06-04 11: 32: 34Z
    2. En una palabra, ¡NOPE! No hay una buena manera de retraer algo que hayas empujado. Todas las retracciones son MALAS en mayor o menor grado. Debe adoptar la disciplina de trabajar en una sucursal en su propio repositorio privado, realizar múltiples confirmaciones a medida que agrega un poco, prueba un poco, modifica un poco. Luego fusione toda su rama en un solo compromiso, escriba un nuevo mensaje de confirmación que describa el cambio general, PRÁCTIRELO y presione.
      2013-06-29 03: 29: 44Z
    3. Solo para señalar lo obvio de que uno no tiene que hacer un solo compromiso al regresar de una rama de características. Lo que mucha gente hace es cambiar de base en la rama de destino (para que las cosas se vean limpias) y luego fusionarse con la opción de suprimir el avance rápido. De acuerdo con el punto principal de tener cuidado antes de subir, sin embargo.
      2013-09-11 18: 20: 34Z
    4. La respuesta git commit --amend ya se había dado (varias veces) antes de que escribieras la tuya. ¿Por qué lo publicaste de nuevo? Si desea agregar un enlace a "Reescribiendo el historial de Git", podría haber editado una de las respuestas existentes o haber dejado un comentario.
      2019-05-02 01: 17: 45Z

    Modificar

    Tienes un par de opciones aquí. Usted puede hacer

     
    git commit --amend
    

    siempre que sea tu último compromiso.

    Rebase interactivo

    De lo contrario, si no es su último compromiso, puede hacer una rebase interactiva,

     
    git rebase -i [branched_from] [hash before commit]
    

    Luego, dentro de la rebase interactiva, simplemente agrega edición a ese compromiso. Cuando aparezca, haga un git commit --amend y modifique el mensaje de confirmación. Si desea retroceder antes de ese punto de confirmación, también podría usar git reflog y simplemente eliminar esa confirmación. Luego simplemente haz un git commit de nuevo.

        
    195
    2014-07-19 23: 45: 05Z

    Si está utilizando la GUI de Git, puede modificar la última confirmación que no se ha enviado con:

     
    Commit/Amend Last Commit
    
        
    183
    2013-03-16 09: 37: 26Z

    Si es su última confirmación, simplemente modifique la confirmación:

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

    (usando la marca -o (--only) para asegurarte de que solo cambies el mensaje de confirmación)


    Si es un compromiso oculto, use la impresionante rebase interactiva :

     
    git rebase -i @~9   # Show the last 9 commits in a text editor
    

    Encuentre la confirmación que desea, cambie pick a r (reword), y guarde y cierre el archivo. Hecho!



    Tutorial de vim en miniatura (o cómo volver a hacer una base con solo 8 pulsaciones 3j cw r Esc ZZ ) :

    • Ejecuta vimtutor si tienes tiempo
    • h j k l corresponden a las teclas de movimiento descontado /kbd> k
    • Todos los comandos pueden tener un prefijo con un "rango", por ejemplo. 3j baja 3 líneas
    • i a enter modo de inserción: el texto que escriba aparecerá en el archivo
    • Esc o Ctrl c para salir del modo de inserción y volver al modo "normal"
    • u para deshacer
    • Ctrl r para rehacer
    • dd , dw , dl para eliminar una línea, palabra o letra, respectivamente
    • cc , cw , cl para cambiar una línea, palabra o letra, respectivamente (igual que dd i )
    • yy , yw , yl para copiar ("tirar") una línea, palabra o letra, respectivamente
    • p o P para pegar después, o antes de la posición actual, respectivamente
    • :w Ingrese para guardar (escribir) un archivo
    • :q! Ingrese para salir sin guardar
    • :wq Ingrese o ZZ para guardar y salir

    Si edita mucho el texto, luego cambie a la distribución del teclado Dvorak, aprenda a teclear y aprenda vim. ¿Vale la pena el esfuerzo? Sí.



    ProTip ™: no tenga miedo de experimentar con comandos "peligrosos" que reescriben el historial *: Git no elimina sus confirmaciones por 90 días de forma predeterminada; Puedes encontrarlos en el reflog:

     
    $ git reset @~3   # go back 3 commits
    $ git reflog
    c4f708b HEAD@{0}: reset: moving to @~3
    2c52489 HEAD@{1}: commit: more changes
    4a5246d HEAD@{2}: commit: make important changes
    e8571e4 HEAD@{3}: commit: make some changes
    ... earlier commits ...
    $ git reset 2c52489
    ... and you're back where you started
    

    * Tenga cuidado con opciones como --hard y --force, ya que pueden descartar datos.
    * Además, no reescribas el historial en ninguna de las sucursales en las que estés colaborando.

        
    173
    2015-04-29 15: 50: 45Z
    1. La parte vim está completamente fuera de tema, y ​​en lugar de alentar a los usuarios a dedicar tiempo a aprender a usar un editor arcano, ¿por qué no enseñarles algo más sobre el tema, como ¿Cómo configurar el editor de git predeterminado para que sea algo fácil de usar, como nano? Estamos hablando de modificaciones triviales que se deben realizar en un archivo de texto, no de codificación hardcore que generaría una guerra de flamas sobre el "mejor" editor de texto.
      2019-05-02 01: 19: 53Z
    2. @ DanDascalescu: Porque es más rápido aprender a Vim usando las instrucciones anteriores que realizar varias rebases usando nano. La razón principal por la que git abre un editor de texto y no su propia interfaz para la rebasación es porque Vim existe: es liviano, se instala de manera predeterminada en la mayoría de los sistemas y es muy fácil de aprender lo suficiente para realizar una rebase con facilidad: por ejemplo. ddjjpZZ mueve un commit 2 hacia abajo. No hay nada arcano en el conocimiento básico de Vim; se tarda 10 minutos en sentirse más cómodo con Vim que con nano.
      2019-05-02 22: 07: 53Z

    Uso la Git GUI tanto como pueda, y eso te da la opción de modificar la última cometer:

    Marque esa casilla

    Además, git rebase -i origin/master es un buen mantra que siempre te presentará los compromisos que has hecho sobre el maestro y te da la opción de corregir, eliminar, reordenar o aplastar. No hay necesidad de conseguir ese hash primero.

        
    165
    2014-05-21 02: 44: 35Z
    1. ¿Cómo llego a esa pantalla que has mostrado en tu ejemplo?
      2014-06-24 20: 01: 47Z
    2. Es la parte inferior derecha de Windows Git Gui. Simplemente seleccione la opción 'Modificar último compromiso', y se rellenará con la información de compromiso más reciente.
      2016-01-29 16: 51: 33Z

    Wow, entonces hay muchas maneras de hacer esto.

    Otra forma de hacer esto es eliminar la última confirmación, pero mantenga los cambios para que no pierda su trabajo. A continuación, puede hacer otra confirmación con el mensaje corregido. Esto se vería algo así como tsu:

     
    git reset --soft HEAD~1
    git commit -m 'New and corrected commit message'
    

    Siempre hago esto si me olvido de agregar un archivo o hacer un cambio.

    Recuerde para especificar --soft en lugar de --hard, de lo contrario perderá ese compromiso por completo.

        
    135
    2014-07-20 08: 21: 55Z
    1. Esto hace exactamente lo mismo que git commit --amend, excepto que es un proceso de 2 pasos.
      2014-12-28 02: 58: 00Z
    2. @ JosephK.Strauss Creo que enmendar la confirmación también mantiene el autor original de confirmación y la información de la fecha, teniendo la información de la nueva fecha y el comitente por separado. No estoy seguro de que este enfoque haga eso.
      2016-05-07 23: 13: 23Z
    3. @ EvertonAgner Tienes razón. --amend mantendrá la información del autor, pero la pregunta solo solicita cambiar el mensaje.
      2016-05-09 13: 59: 34Z

    Para cualquier persona que busque una GUI de Windows /Mac para ayudar con la edición de mensajes antiguos (es decir, no solo el último mensaje), recomendaría SourceTree . Los pasos a seguir están a continuación.

    Rebase interactivo de SourceTree

    Para confirmaciones que aún no se han enviado a un control remoto:

    1. Asegúrese de haber confirmado o guardado todos los cambios actuales (es decir, para que no haya archivos enumerados en la pestaña "Estado del archivo"), de lo contrario no funcionará.
    2. En la pestaña "Registro /Historial", haga clic con el botón derecho en la entrada con una línea contigua en el gráfico uno abajo los comités que desee editar y seleccione "Rebase children of < commit ref > interactivamente ... "
    3. Seleccione la fila completa para el mensaje de confirmación que desea cambiar ( es decir, haga clic en la columna "Mensaje" ).
    4. Haz clic en el botón "Editar mensaje".
    5. Edite el mensaje como desee en el cuadro de diálogo que aparece y luego haga clic en Aceptar.
    6. Repita los pasos 3-4 si hay otros mensajes de confirmación para cambiar.
    7. Haga clic en Aceptar: Comenzará la rebase. Si todo está bien, la salida terminará "Completado con éxito". NOTA: Recientemente he visto que falla con Unable to create 'project_path/.git/index.lock': File exists. al intentar modificar varios mensajes de confirmación al mismo tiempo. No estoy seguro de cuál es exactamente el problema o de si se solucionará en una versión futura de SourceTree, pero si esto sucede, se recomienda volver a basarlas una en una (más lento pero parece más confiable).

    ... O ... para confirmaciones que ya se han enviado:

    Siga los pasos en esta respuesta , que son similares a los anteriores, pero requieren que se ejecute un comando adicional desde el comando Línea para forzar el empuje de la rama: léelo todo y aplique la precaución necesaria.

        
    126
    2019-06-17 13: 20: 56Z

    Si solo desea editar el último uso de confirmación:

     
    git commit --amend
    

    o

     
    git commit --amend -m 'one line message'
    

    Pero si desea editar varias confirmaciones seguidas, debe utilizar la rebasación en su lugar:

     
    git rebase -i <hash of one commit before the wrong commit>
    

    git rebase editing

    En un archivo como el anterior escribe edit /e o una de las otras opciones y presiona guardar y salir.

    Ahora estarás en el primer error de confirmación. Realice cambios en los archivos y se almacenarán automáticamente para usted. Tipo

     
    git commit --amend
    

    guárdalo y sal de eso y escribe

     
    git rebase --continue 
    

    para pasar a la siguiente selección hasta que termine con todas sus selecciones.

    Tenga en cuenta que estas cosas cambian todos sus hashes SHA después de ese compromiso en particular.

        
    124
    2014-07-19 17: 42: 48Z
    1. git rebase -i < hash de una confirmación antes de la confirmación incorrecta > funciona para mi. gracias.
      2018-04-13 00: 57: 11Z

    Si solo desea cambiar su último mensaje, debe utilizar el indicador --only o su acceso directo -o con commit --amend:

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

    Esto garantiza que no realce accidentalmente su compromiso con cosas preparadas. Por supuesto, es mejor tener una configuración $EDITOR adecuada. Luego puede dejar la opción -m fuera y git precargará el mensaje de confirmación con el anterior. De esta forma se puede editar fácilmente.

        
    123
    2015-03-13 10: 38: 50Z
    1. La respuesta "top" no responde la pregunta. Solo da una introducción general al git commit --amend. La pregunta fue muy específica, por lo tanto más larga = mejor. La mención decisiva de la bandera -o probablemente estaría enterrada en el resto de la información. Tampoco me siento cómodo editando una respuesta que ya tenga tantos votos.
      2014-07-20 20: 51: 26Z
    2. Dicho esto, eres libre de editar la respuesta principal, ya que existe un peligro real de que las personas lo utilicen como la respuesta "correcta". Puede suceder fácilmente enmendar tu compromiso con cosas preparadas, me sucedió a mí, y es realmente molesto cuando tienes que empujar eso. Pero aún así, la cantidad no es garantía de corrección. Ni en el número de respuestas ni en el número de votos.
      2014-07-20 20: 51: 54Z
    3. No iría tan lejos para decir que la respuesta superior es "incorrecto" y que "no responde a la pregunta". Definitivamente funciona y responde a la pregunta, solo debe asegurarse de no tener cambios en etapas cuando intenta enmendar. Pero veo su punto de tener que advertir a la gente sobre eso. Lo editaré más tarde si tengo tiempo.
      2014-07-21 21: 26: 20Z
    4. Para ser justos: a pesar de que la opción --only con --amend está disponible desde git 1.3.0, no funcionó correctamente hasta que se corrigió en 1.7.11.3 ( ea2d4ed35902ce15959965ab86d80527731a177c ). Entonces, la respuesta correcta en 2008 probablemente habría sido algo como: git stash; git commit --amend; git stash pop.
      2014-07-21 23: 00: 48Z

    Actualice su último mensaje de confirmación incorrecto con un nuevo mensaje de confirmación en una línea:

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

    O, prueba git reset como abajo:

     
    # You can reset your head to n number of commit
    # NOT a good idea for changing last commit message
    # but you can get an idea to split commit into multiple commits
    git reset --soft HEAD^
    
    # it will reset you last commit. Now, you
    # can re-commit it with new commit message.
    

    Usar reinicio para dividir confirmaciones en confirmaciones más pequeñas

    git reset también puede ayudarlo a dividir una confirmación en múltiples confirmaciones:

     
    # reset your head. I am resetting to last commits:
    git reset --soft HEAD^
    # (you can reset multiple commit by doing HEAD~2(no. of commits)
    
    # Now, reset your head for splitting it to multiple commits
    git reset HEAD
    
    # add and commit your files seperately to make multiple commits: e.g
    git add app/
    git commit -m "add all files in app directory"
    
    git add config/
    git commit -m "add all files in config directory"
    

    Aquí ha roto con éxito su último compromiso en dos confirmaciones.

        
    99
    2014-07-22 06: 24: 54Z
    1. Si todo lo que quiere hacer es editar el mensaje de su última confirmación, usar un reinicio por software para ese fin es over-kill . Simplemente use git commit --amend, exactamente como se dice en la respuesta más votada . Además, git reset --soft HEAD^ funciona de manera idéntica al restablecimiento parcial en esta respuesta anterior , porque ambos se restablecen de nuevo al primer compromiso principal.
      2014-07-21 23: 15: 47Z
    2. Solo me molesto en agregar git reset en la solución solo para dar una idea de dividir un mensaje de confirmación en varios mensajes de confirmación. Porque, he enfrentado ese problema cuando, estaba empezando a usar git. A veces, esto puede ser realmente útil. :)
      2014-07-22 06: 29: 00Z

    Sobre esta pregunta hay muchas respuestas pero ninguna de ellas explicaIns en super detalle cómo cambiar los mensajes de confirmación antiguos usando VIM. Me quedé atascado tratando de hacer esto yo mismo, ¡así que aquí voy a anotar en detalle cómo hice esto especialmente para las personas que no tienen experiencia en VIM!

    Quería cambiar mis cinco confirmaciones más recientes que ya había enviado al servidor. Esto es bastante 'peligroso' porque si alguien más lo sacó, puedes arruinar las cosas cambiando los mensajes de confirmación. Sin embargo, cuando estás trabajando en tu propia pequeña sucursal y estás seguro de que nadie la sacó, puedes cambiarlo así:

    Supongamos que desea cambiar sus cinco últimas confirmaciones, luego escriba esto en el terminal:

    git rebase -i HEAD~5 * Donde 5 es el número de mensajes de confirmación que desea cambiar. (por lo tanto, si desea cambiar el décimo al último compromiso, escriba 10)

    Este comando te llevará a VIM allí, puedes "editar" tu historial de confirmación. Verás tus últimos 5 confirmaciones en la parte superior así:

    pick <commit hash> commit message

    En lugar de pick necesitas escribir reword. Puedes hacer esto en VIM escribiendo i, que te hace entrar en modo INSERTAR. (Verá que está en modo de inserción con la palabra INSERTAR en la parte inferior) Para las confirmaciones que desea cambiar escriba reword en lugar de pick

    Luego debes guardar y salir de esta pantalla; para ello, primero debes ingresar al "modo de comando" presionando el botón esc. (Puedes verificar que estás en modo comando si la palabra INSERTAR ha desaparecido). Luego, puedes escribir un comando escribiendo :, el comando para guardar y salir es wq. Así que si escribes :wq estás en el camino correcto.

    Luego, VIM repasará todos los mensajes de confirmación que desea volver a redactar, aquí puede cambiar los mensajes de confirmación. Para ello, acceda al modo INSERTAR, cambie el mensaje de confirmación, ingrese al modo comando y guarde y salga. ¡Hazlo 5 veces y ya no estás en VIM!

    Luego, si ya presionaste tus confirmaciones erróneas, necesitas git push --force para sobrescribirlas. Recuerde que el git push --force es algo muy peligroso de hacer, así que asegúrese de que nadie haya salido del servidor, ya que presionó sus errores incorrectos.

    ¡Ahora has cambiado tus mensajes de confirmación!

    (Como ves, no tengo mucha experiencia en VIM, así que si uso una 'jerga' incorrecta para explicar lo que está sucediendo, ¡siéntete libre de corregirme!)

        
    82
    2014-08-19 04: 34: 23Z
    1. <nitpick> No hay "hilos" en Stack Overflow, porque no es un foro de discusión, solo hay "preguntas", "respuestas" y "posts". </nitpick>. Además, no todas las versiones de Vim son iguales, no todas te permitirán eliminar caracteres en el modo de inserción (tiene sentido de alguna manera, ¿verdad?). Si desea poder siempre eliminar caracteres en Vim, X y x lo harán (el pequeño x elimina caracteres delante del cursor, X eliminará detrás). Si comete errores, puede usar u repetidamente para deshacer. Finalmente, r es una abreviatura de reword en el editor de rebase interactivo.
      2014-08-07 17: 47: 10Z
    2. Para cambiar una palabra en vim se escribe cw al principio (aunque la pregunta no es sobre vim, estoy de acuerdo).
      2015-12-05 06: 25: 59Z
    3. No necesita usar esa abominación . Puede configurar su editor de git para algo sensato y fácil de usar, como nano o mcedit del Comandante de medianoche.
      2019-05-02 01: 28: 41Z

    He añadido el alias de reci, recm para recommit (amend), ahora puedo hacerlo con git recm o git recm -m.

     
    $ vim ~/.gitconfig
    
    [alias]
    
        ......
        cm = commit
        reci = commit --amend
        recm = commit --amend
        ......
    
        
    76
    2014-03-11 08: 21: 36Z

    Puede utilizar git-rebase-reword

    Está diseñado para editar cualquier confirmación (no solo la última) de la misma forma que commit --amend

     
    $ git rebase-reword <commit-or-refname>
    

    Lleva el nombre de la acción en reBase interactiva para modificar un commit: "reword". Consulte esta publicación y man -sección modo interactivo-

    Ejemplos:

     
    $ git rebase-reword b68f560
    $ git rebase-reword HEAD^
    
        
    76
    2015-07-29 22: 28: 58Z
    1. Esto requiere la instalación de un programa externo. En mi opinión, sería mejor aprender a usar las herramientas integradas y los alias de manera más efectiva. Escribiría: g c; g rb -i @~9 (cometer y rebase), mover el nuevo cometer a donde lo quiero, cambiar commit a f (fixup) y guardar. Si quisieras algo más rápido que eso, podrías alias git commit --fixup=<commit>; git rebase -i --autosquash <commit>^
      2015-04-29 15: 25: 01Z
    2. github.com/qxo/git -rebase-reword tanto para Linux como para Windows
      2016-10-29 10: 25: 14Z

    Me di cuenta de que había empujado un commit con un error tipográfico en él. Para deshacer, hice lo siguiente:

     
    git commit --amend -m "T-1000, advanced prototype"
    git push --force
    

    Advertencia: la fuerza que empuja sus cambios sobrescribirá la rama remota con la local. Asegúrese de que no va a sobrescribir nada de lo que desea conservar. También tenga cuidado de forzar la aplicación de un compromiso modificado (reescrito) si alguien más comparte la sucursal con usted, ya que tendrán que volver a escribir su propio historial si tienen la copia antigua del compromiso que acaba de reescribir.

        
    54
    2014-08-05 14: 44: 50Z
    1. Nada se "sobrescribe" nunca en git. En este caso, el puntero de rama se establecerá en su nuevo compromiso y el antiguo compromiso quedará obsoleto si no se dejan referencias y se puede limpiar después de unas semanas. (Hasta entonces, otros aún pueden encontrarlo y hacer referencia a él, por ejemplo, buscando en el reflog.)
      2014-09-04 23: 47: 35Z

    Me gusta usar lo siguiente:

    1. git status
    2. git add --all
    3. git commit -am "message goes here about the change"
    4. git pull <origin master>
    5. git push <origin master>
    49
    2015-02-03 11: 08: 43Z

    Si no ha insertado el código en su sucursal remota ( GitHub /Bitbucket ) puede cambiar el mensaje de confirmación en la línea de comando como se muestra a continuación.

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

    Si estás trabajando en una rama específica, haz esto:

     
    git commit --amend -m "BRANCH-NAME: new message"
    

    Si ya ha presionado el código con el mensaje incorrecto y debe tener cuidado al cambiar el mensaje. Es decir, después de cambiar el mensaje de confirmación y volver a intentarlo, terminas con problemas. Para que sea suave, sigue estos pasos.

    Lee mi respuesta completa antes de hacerlo

     
    git commit --amend -m "BRANCH-NAME : your new message"
    
    git push -f origin BRANCH-NAME                # Not a best practice. Read below why?
    

    Nota importante: cuando usa la fuerza de empuje directamente, puede terminar con problemas de código que otros desarrolladores están trabajando en la misma rama. Así que para evitar esos conflictos, debe extraer el código de su sucursal antes de hacer forzar empuje :

     
     git commit --amend -m "BRANCH-NAME : your new message"
     git pull origin BRANCH-NAME
     git push -f origin BRANCH-NAME
    

    Esta es la mejor práctica cuando se cambia el mensaje de confirmación, si ya se ha enviado.

        
    43
    2015-02-03 11: 14: 19Z
fuente colocada aquí