¿Cómo modificar los mensajes de confirmación existentes, no enviados

7664

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

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

Laurie Young
fuente
868
Para aquellos algo nuevos en git: el punto de Laurie sobre no haber empujado aún es importante. Al igual que el rebase, esto está cambiando la historia. Si alguien ha clonado / extraído de su repositorio entre el historial original y el reescrito, entonces no podrá extraer después de la reescritura (para esa rama).
Pat Notz

Respuestas:

16132

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 configurar el mensaje de confirmación directamente en la línea de comando 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 engorrosos de ingresar.

Asegúrese de que no tiene cambios de copia de trabajo organizados antes de hacer esto o se comprometerán también. ( Unstaged cambios no se confirmen.)

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

Si ya ha enviado su confirmación a su rama remota, entonces, después de modificar su confirmación localmente (como se describió anteriormente), también deberá forzar la confirmación con:

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

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

Advertencia: tenga cuidado al modificar los compromisos que ya ha compartido con otras personas. Las confirmaciones de modificación esencialmente las reescribe para que tengan diferentes ID de SHA , lo que plantea un problema si otras personas tienen copias de la confirmación anterior que usted ha reescrito. Cualquier persona que tenga una copia de la confirmación anterior deberá sincronizar su trabajo con la confirmación recién reescrita, lo que a veces puede ser difícil, así que asegúrese de coordinarse con otros cuando intente reescribir el historial de confirmación compartido, o simplemente evite volver a escribir confirmaciones compartidas en total.


Realizar un rebase interactivo

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

Para hacer una calabaza Git, sigue estos pasos:

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

Una vez que aplaste sus commits, elija el e/rpara editar el mensaje:

Ingrese la descripción de la imagen aquí

Nota importante sobre rebase interactivo

Cuando lo usas git rebase -i HEAD~npuede haber más de n commits. Git "recopilará" todos los commits en los últimos n commits, y si hubo una fusión en algún punto entre ese rango, también verá todos los commits, por lo que el resultado será n +.

Buen consejo:

Si tiene que hacerlo por más de una rama y puede enfrentar conflictos al modificar el contenido, configure git rererey deje que Git resuelva esos conflictos automáticamente por usted.


Documentación

usuario456814
fuente
257
Sin embargo, git commit --amendno es tan poderoso como git rebase -i.
Jeffrey Jose
76
@ jeffjose, definitivamente no tiene por qué ser así. Además, git commit --amendpuede arreglar la confirmación maestra (a?).
extraño
116
Si ya has presionado, solo presiona de nuevo:git push -f origin branchname
Hughes
177
@hughes no es git push -fun poco peligroso si otras personas están usando el mismo repositorio?
Armand
9191
Si no desea reescribir 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.
Sam
2506
git commit --amend -m "your new message"
lfx_cool
fuente
77
Git commit --amend -m "Nuevo mensaje", pero presionar a Github generó la opción "Combinar los cambios remotos antes de presionar nuevamente". Después de extraer, confirmar - enmendar y presionar nuevamente, el nuevo mensaje no aparece. En cambio, tengo "Combinar rama 'maestro' de github.com :[myrepo]"
Dave Everitt
8
@DaveEveritt probablemente empujó su confirmación antes de intentar solucionarlo.
Thorbjørn Ravn Andersen
12
@ Kyralessa no es cierto. En bash, puede componer fácilmente mensajes de confirmación de varias líneas simplemente no cerrando la cita hasta que haya terminado (presionando retorno al final de cada línea dentro de las citas).
encimeras
32
No entiendo cómo una respuesta que se parece mucho a la idea principal de una respuesta que se escribió hace dos años y también la respuesta aceptada obtiene tantos votos. Extraño. (sin embargo, no hay nada malo con la respuesta)
codificador feliz
77
@AmalMurali, bueno. Mi punto no era tanto sobre la popularidad de la pregunta, ni la utilidad de la respuesta. Pero esta respuesta en particular no es la respuesta más antigua, ni ofrece más información sobre la respuesta aceptada. Parece ser una copia de una sección de la respuesta aceptada. Ese fue mi punto. ¡SALUD!
codificador feliz
2376

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

  1. git rebase --interactive $parent_of_flawed_commit

    Si desea corregir varios commits defectuosos, pase el padre del más antiguo de ellos.

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

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

  3. Por cada confirmación que desee reformular , Git lo regresará a su editor. Por cada confirmación que desea editar , Git lo deja en el shell. Si estás en la cáscara:

    1. Cambia el commit de la forma que quieras.
    2. git commit --amend
    3. git rebase --continue

La mayor parte de esta secuencia se le explicará mediante la salida de los diversos comandos a medida que avanza. Es muy fácil; no necesita memorizarlo, solo recuerde que le git rebase --interactivepermite corregir confirmaciones sin importar cuánto tiempo hace.


Tenga en cuenta que no querrá cambiar las confirmaciones que ya ha presionado. O tal vez lo haga, pero en ese caso tendrá que tener mucho cuidado para comunicarse con todos los que pueden haber realizado sus compromisos y haber trabajado sobre ellos. ¿Cómo me recupero / resincronizo después de que alguien empuje un rebase o un reset a una rama publicada?

Aristóteles Pagaltzis
fuente
39
¿Se puede cambiar el mensaje de la primera confirmación (que no tiene un padre)?
13ren
27
Esto se menciona en una de las otras respuestas, pero pondré una nota aquí. Desde git 1.6.6 puede usarlo reworden lugar de pickeditar el mensaje de registro.
MitMaro
89
Por cierto, $parent_of_flawed_commites equivalente a $flawed_commit^.
Peeja
67
¡NUNCA haga esto (o rebase en general) si ya ha empujado contra la corriente!
Daniel Rinser
20
Use -p( --preserve-merges) si hubo una fusión después de la confirmación defectuosa.
ahven
778

Para modificar la confirmación anterior, realice los cambios que desee y organice esos cambios, y luego ejecute

git commit --amend

Esto abrirá un archivo en su editor de texto que representa su nuevo mensaje de confirmación. Comienza poblado con el texto de su antiguo mensaje de confirmación. Cambie el mensaje de confirmación como 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: También puede "Realizar el cambio que desee" desde el editor abierto por git commit --amend

Fatih Acet
fuente
18
git rebase -i HEAD~commit_counttambién le permitirá cambiar los mensajes de confirmación de la cantidad de confirmaciones que elija. Simplemente marque los commits elegidos como "reword" en lugar de "pick".
Joe
2
¿Qué pasa si no quieres rebase? ¿Solo quieres cambiar un mensaje anterior?
SuperUberDuper
3
git reset --hardaniquila los cambios no comprometidos. Por favor reemplace --hardcon --soft.
anguila ghEEz
1
De acuerdo, git reset --hardes un comando perfectamente legítimo, pero es engañoso dada la pregunta. ¡Usas --hardsi cometiste cambios que quieres tirar, no si cometiste un error tipográfico en el mensaje de confirmación!
Soren Bjornstad
398

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

git commit -a --amend -m "My new commit message"
Juan
fuente
44
Y si no desea agregar todo, primero puede hacerlo y git add file.extluego simplementegit commit --amend
MalcolmOcean
358

También puedes usar git filter-branchpara eso.

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

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

Tenga en cuenta que esto intentará reescribir cada commit entre HEADy el commit defectuoso, por lo que debe elegir su msg-filtercomando con mucha prudencia ;-)

marca
fuente
44
¿Existe una versión de esto que no cambie la confirmación si la expresión regular no encuentra nada?
sjakubowski
3
AFAIK filter-branch --msg-filter generará nuevos commits en cualquier caso. Sin embargo, puede verificar dentro del filtro msg, si el sed tuvo éxito y usar esta información cuando finalice la operación de ramificación del filtro para restablecer su árbol a refs / original.
Mark
44
@DavidHogue Esto solo es cierto cuando se usa el método filter-branch. Los ID de confirmación después de una confirmación modificada no cambian si utiliza la nueva versión interactiva.
Mark
66
@ Mark Sí, lo hacen, están obligados a hacerlo. Los ID de confirmación dependen de las confirmaciones anteriores. Si no cambiaran, git sería inútil.
Miles Rout
2
Necesitas $flawed_commit^..HEADno $flawed_commit..HEAD. como se indica en la página de manual: « El comando solo reescribirá las referencias positivas mencionadas en la línea de comando (por ejemplo, si pasa a..b, solo b se reescribirá). »
Ángel
319

Prefiero de esta manera:

git commit --amend -c <commit ID>

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

krevedko
fuente
77
Para mí, el uso de su comando anterior en realidad crea una nueva confirmación con una nueva ID de confirmación más una confirmación adicional que dice "fusionar rama" como mensaje de confirmación predeterminado.
Jan
46
La modificación siempre crea una nueva confirmación con una nueva ID de confirmación. 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 las colisiones de hash, garantiza que dos confirmaciones con la misma ID son exactamente la misma confirmación, con exactamente el mismo contenido, historial, etc.
Emil Lundberg
77
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 debe usar como plantilla / predeterminado para su nueva confirmación ... Realmente ya va a hacer "-c <ID de confirmación>" de forma predeterminada , por lo que no es necesario especificarlo.
Gal
2
El -chace algunas cosas. Utiliza el mensaje antiguo por defecto, pero también copia la información de autoría (persona y hora). -Chace lo mismo excepto que no le pide que edite el mensaje.
Joseph K. Strauss
1
Al igual que @SantanuDey, no funcionó para mí. Tengofatal: Option -m cannot be combined with -c/-C/-F/--fixup.
Andrew Grimm
312

Si está utilizando la herramienta Git GUI, hay un botón llamado Modificar ú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 confirmarlo con un nuevo mensaje de confirmación.

O use este comando desde una consola / terminal:

git commit -a --amend -m "My new commit message"
Akhilraj NS
fuente
44
Esta respuesta es literalmente idéntica a esta anterior . ¿Ha verificado las respuestas existentes antes de suministrar otra?
Dan Dascalescu
284

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 cuya confirmación desea modificar. Haz tus cambios y luego escénalos 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 al commit principal anterior.

Shoaib Ud-Din
fuente
1
Si desea asegurarse de que su cambio haya git commit --amendtenido efecto, puede usarlo git showy le mostrará el nuevo mensaje.
Steve Tauber
279
  1. Si solo desea modificar su último mensaje de confirmación, haga lo siguiente:

    git commit --amend
    

Eso lo colocará en su editor de texto y le permitirá cambiar el último mensaje de confirmación.

  1. Si desea cambiar los últimos tres mensajes de confirmación, o cualquiera de los mensajes de confirmación hasta ese punto, proporcione HEAD~3al git rebase -icomando:

    git rebase -i HEAD~3
    
Heena Hussain
fuente
66
Esta respuesta anterior ya se dice que se puede usar git commit --amend, y también se dice que se puede usar git rebase -i HEAD~commit_count, todo lo que hizo fue enchufe 3para commit_count.
Votado abajo también. La gente simplemente no se molesta en leer las respuestas existentes .
Dan Dascalescu
261

Si tiene que cambiar un mensaje de confirmación anterior en varias ramas (es decir, la confirmación con el mensaje erróneo está presente en varias ramas), puede usar:

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

Git creará un directorio temporal para reescribir y adicionalmente respaldar referencias antiguas refs/original/.

  • -fhará cumplir 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 colocar esta bandera.

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

  • --allse asegurará de que todas las ramas y etiquetas se reescriban.

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

Digamos que desea recuperar su maestro y acceder a él en la rama old_master:

git checkout -b old_master refs/original/refs/heads/master
sebers
fuente
3
Esta respuesta no aborda la pregunta del OP, ya que están puramente interesados ​​en arreglar una confirmación que acaban de hacer. Yo uso regularmente git commit --amendpara arreglar los comentarios o añadir archivos se me olvidó git add, pero sólo nunca antes he git pushed. También lo uso git filter-branchcuando quiero meterme totalmente 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ío!
kbro
226

Utilizar

git commit --amend

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

piel
fuente
2
¿Hay una buena manera de arreglar los mensajes de confirmación ya enviados a un repositorio público? Hasta ahora llegué a la conclusión de que, una vez presionados, mis mensajes de error tipográficos y thinkos tienen que vivir para siempre.
stackunderflow
2
En una palabra, ¡NO! No hay una BUENA forma de retractarse de algo que ha empujado. Todas las retracciones son MALAS en mayor o menor grado. Debe adoptar la disciplina de trabajar en una rama en su propio repositorio privado, realizar múltiples confirmaciones a medida que agrega un poco, prueba un poco, modifica un poco. Luego combine toda su rama en una única confirmación, escriba un nuevo mensaje de confirmación que describa el cambio general, PRUEBE y empuje.
kbro
1
Solo para señalar lo obvio que uno no tiene que hacer una sola confirmación al regresar de una rama de características. Lo que mucha gente hace es volver a crear una 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. Sin embargo, esté de acuerdo con el punto principal de tener cuidado antes de empujar hacia arriba.
ShawnFumo
1
La git commit --amendrespuesta 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 "Reescribir el historial de Git", podría haber editado una de las respuestas existentes o haber dejado un comentario.
Dan Dascalescu
199

Enmendar

Tienes un par de opciones aquí. Tu puedes hacer

git commit --amend

siempre y cuando sea tu último compromiso.

Rebase interactivo

De lo contrario, si no es su último commit, puede hacer un rebase interactivo,

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

Luego, dentro del rebase interactivo, simplemente agrega edición a ese commit. Cuando aparezca, haga una git commit --amendy modifique el mensaje de confirmación. Si desea retroceder antes de ese punto de confirmación, también puede usar git reflogy simplemente eliminar esa confirmación. Entonces solo haces una git commitvez más.

wallerjake
fuente
191

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

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

(Usando la bandera -o( --only) para asegurarte de cambiar solo el mensaje de confirmación)


Si se trata de una confirmación enterrada, 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 picka r( reword) y guarde y cierre el archivo. ¡Hecho!



Tutorial de Vim en miniatura (o cómo hacer un rebase con solo 8 teclas 3jcwrEscZZ):

  • Corre vimtutorsi tienes tiempo
  • hjkl corresponden a teclas de movimiento
  • Todos los comandos pueden tener como prefijo un "rango", por ejemplo, se 3jmueve hacia abajo tres líneas
  • i para ingresar al modo de inserción: el texto que escriba aparecerá en el archivo
  • Esco Ctrlcpara salir del modo insertar y volver al modo "normal"
  • u deshacer
  • Ctrlr Rehacer
  • dd, dw, dlPara borrar una línea, palabra, o por carta, respectivamente
  • cc, cw, clPara cambiar una línea, palabra, o por carta, respectivamente (lo mismo queddi )
  • yy, yw, ylCopiar ( "tirón") una línea, palabra, o por carta, respectivamente
  • po Ppegar después o antes de la posición actual, respectivamente
  • :wEnter guardar (escribir) un archivo
  • :q!Enter salir sin guardar
  • :wqEntero ZZpara guardar y salir

Si edita mucho texto, cambie al diseño del teclado Dvorak , aprenda a escribir con teclado y aprenda Vim. ¿Vale la pena el esfuerzo? Si.



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

$ git reset @~3   # Go back three 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 las opciones como --hardy --forceaunque pueden descartar datos. * Además, no reescriba el historial en ninguna rama en la que esté colaborando.

Zaz
fuente
3
La parte vim está completamente fuera de tema, y ​​en lugar de alentar a los usuarios a pasar tiempo aprendiendo a usar un editor arcano, ¿por qué no enseñarles algo más sobre el tema, como cómo configurar el editor git predeterminado para que sea algo fácil de usar, como nano? Estamos hablando de modificaciones triviales que deben hacerse en un archivo de texto, no de codificación hardcore que generaría una guerra de llamas sobre el "mejor" editor de texto.
Dan Dascalescu
1
@DanDascalescu: Porque es más rápido aprender Vim usando las instrucciones anteriores que realizar varias rebases usando nano. La razón por la que git abre un editor de texto y no su propia interfaz para el rebase es porque Vim existe: es liviano, está instalado por defecto en la mayoría de los sistemas y es muy fácil de aprender lo suficiente como para realizar un rebase con facilidad: por ejemplo, ddjjpZZmueve un commit 2 hacia abajo. No hay nada arcano en el conocimiento básico de Vim; Se necesitan 10 minutos para sentirse más cómodo con Vim que con nano.
Zaz
185

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

Commit/Amend Last Commit
gulchrider
fuente
168

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

Marque esa casilla

Además, git rebase -i origin/masteres un buen mantra que siempre te presentará las confirmaciones que has realizado sobre master y te dará la opción de modificar, eliminar, reordenar o aplastar. No es necesario obtener ese hash primero.

Havard Graff
fuente
44
¿Cómo llego a la pantalla que ha mostrado en su ejemplo?
Marwan مروان
2
Es la parte inferior derecha de Windows Git Gui. Simplemente seleccione el botón 'Modificar última confirmación', y se completará con la información de confirmación más reciente.
wbdarby
138

Wow, entonces hay muchas maneras de hacer esto.

Otra forma de hacerlo es eliminar la última confirmación, pero mantener sus cambios para que no pierda su trabajo. Luego puede realizar otra confirmación con el mensaje corregido. Esto se vería así:

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

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

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

Radu Murzea
fuente
55
Esto hace exactamente lo mismo, git commit --amendexcepto que es un proceso de 2 pasos.
Joseph K. Strauss
3
@ JosephK.Strauss Creo que enmendar el commit también mantiene la información original del autor del commit y la fecha, teniendo el nuevo commiter y la información de la fecha por separado. No estoy seguro de que este enfoque haga eso.
everton
44
@EvertonAgner Estás en lo correcto. --amendmantendrá la información del autor, pero la pregunta solo pide cambiar el mensaje.
Joseph K. Strauss
131

Para cualquiera 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 ocultado todos los cambios actuales (es decir, para que no haya archivos listados 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 debajo de las confirmaciones que desea editar y seleccione "Rebase hijos de <commit ref> interactivamente ..."
  3. Seleccione la fila completa para un mensaje de confirmación que desea cambiar (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 OK .
  6. Repita los pasos 3-4 si hay otros mensajes de confirmación para cambiar.
  7. Haga clic OK: Comenzará la reformulación. Si todo está bien, la salida finalizará "Completado con éxito". NOTA: A veces he visto que esto falla Unable to create 'project_path/.git/index.lock': File exists.cuando intento modificar varios mensajes de confirmación al mismo tiempo. No estoy seguro de cuál es exactamente el problema, o si se solucionará en una versión futura de Sourcetree, pero si esto sucede, recomendaría cambiar el nombre de uno en uno (más lento pero parece más confiable).

... O ... para las confirmaciones que ya se han presionado:

Siga los pasos de esta respuesta , que son similares a los anteriores, pero requieren que se ejecute un comando adicional desde la línea de comando ( git push origin <branch> -f) para forzar la rama. ¡Recomiendo leerlo todo y aplicar la precaución necesaria!

Steve Chambers
fuente
de todas las respuestas: este es el más apropiado para todos los novatos git ^^^ (use un programa gratuito SourceTree y aplique "Rebase children of" en una confirmación antes de la que desea editar)
revelt
127

Si solo desea editar la última confirmación, use:

git commit --amend

o

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

Pero si desea editar varias confirmaciones seguidas, en su lugar, debe usar rebase:

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

Edición de rebase Git

En un archivo, como el anterior, escriba edit/eo una de las otras opciones, y presione guardar y salir.

Ahora estarás en el primer commit incorrecto. Realice cambios en los archivos y se organizarán automáticamente para usted. Tipo

git commit --amend

Guarde y salga de eso y escriba

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 esa confirmación en particular.

Shubham Chaudhary
fuente
2
git rebase -i <hash de una confirmación antes de que la confirmación incorrecta> funcione para mí. Gracias.
Viraths
127

Si solo desea cambiar su último mensaje, debe usar la --onlybandera o su acceso directo -ocon commit --amend:

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

Esto asegura que no mejorará accidentalmente su confirmación con cosas preparadas. Por supuesto, es mejor tener una $EDITORconfiguración adecuada . Luego puede dejar la -mopción fuera y Git completará previamente el mensaje de confirmación con el anterior. De esta manera se puede editar fácilmente.

David Ongaro
fuente
1
La respuesta "superior" no responde la pregunta. Simplemente da una introducción general a git commit --amend. La pregunta era muy específica, por lo tanto, más larga = mejor. La mención decisiva de la -obandera probablemente estaría enterrada en el resto de la información. Tampoco me siento cómodo editando una respuesta que ya tiene tantos votos.
David Ongaro
2
Dicho esto, eres libre de editar la respuesta principal, ya que existe un peligro real de que la gente la use como la respuesta "correcta". Puede pasar fácilmente a enmendar su confirmación con cosas preparadas: me sucedió a mí, y es realmente molesto cuando lo presionas. Pero aún así, la cantidad no es garantía de exactitud. Ni en número de respuestas ni en número de votos.
David Ongaro
1
No iría tan lejos como para decir que la respuesta principal es "incorrecta" y que "no responde la pregunta". Definitivamente funciona y responde a la pregunta, solo debe asegurarse de no tener cambios organizados cuando intente modificar. Pero veo tu punto sobre tener que advertir a la gente sobre eso. Lo editaré más tarde si tengo tiempo.
1
Para ser justos: aunque la --onlyopción con --amendestá disponible desde git 1.3.0, no funcionó correctamente hasta que se corrigió en 1.7.11.3 ( ea2d4ed35902ce15959965ab86d80527731a177c ). Así que la parte posterior respuesta correcta en 2008, probablemente habría sido algo así como: git stash; git commit --amend; git stash pop.
David Ongaro
103

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

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

O prueba Git reset como a continuación:

# 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.

Uso de reset para dividir commits en commits más pequeños

git reset también puede ayudarte a dividir una confirmación en varias 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 separately 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 dividido con éxito su última confirmación en dos confirmaciones.

przbadu
fuente
3
Si todo lo que desea hacer es editar el mensaje de su última confirmación, el uso de un restablecimiento parcial para ese propósito es una eliminación excesiva . Simplemente use git commit --amend, exactamente como 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 al primer compromiso principal.
3
Solo me molesto en agregar git resetla solución solo para dar una idea de dividir un mensaje de confirmación en varios mensajes de confirmación. Porque, me enfrenté a ese problema cuando comencé a usar git. A veces, esto puede ser realmente útil. :)
przbadu
87

Sobre esta pregunta hay muchas respuestas, pero ninguna de ellas explica con gran detalle cómo cambiar los mensajes de confirmación más antiguos usando Vim . Estaba atrapado tratando de hacer esto yo mismo, así que aquí escribiré en detalle cómo hice esto, especialmente para las personas que no tienen experiencia en Vim.

Quería cambiar mis cinco últimas confirmaciones que ya envié al servidor. Esto es bastante 'peligroso' porque si alguien más ya se retiró de esto, puede arruinar las cosas cambiando los mensajes de confirmación. Sin embargo, cuando trabaje en su propia rama pequeña y esté seguro de que nadie la tiró, puede cambiarla así:

Digamos que desea cambiar sus cinco últimas confirmaciones, y luego escribe esto en la 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 la décima para la última confirmación, escriba 10).

Este comando lo llevará a Vim allí donde puede 'editar' su historial de confirmación. Verá sus últimas cinco confirmaciones en la parte superior de esta manera:

pick <commit hash> commit message

En lugar de pickque necesites escribir reword. Puede hacer esto en Vim escribiendo i. Eso te hace entrar al modo de inserción . (Verá que está en modo de inserción con la palabra INSERTAR en la parte inferior). Para las confirmaciones que desea cambiar, escriba en rewordlugar de pick.

Luego debe guardar y salir de esta pantalla. Para hacerlo, primero ingrese al 'modo de comando' presionando el Escbotón (puede verificar que está en modo de comando si la palabra INSERTAR en la parte inferior ha desaparecido). Luego puede escribir un comando escribiendo :. El comando para guardar y salir es wq. Entonces, si escribe :wq, está en el camino correcto.

Luego, Vim repasará cada mensaje de confirmación que desee reformular, y aquí puede cambiar los mensajes de confirmación. Para ello, deberá ingresar al modo de inserción, cambiar el mensaje de confirmación, ingresar al modo de comando y guardar y salir. ¡Haz esto cinco veces y te quedarás sin Vim!

Luego, si ya presionó sus confirmaciones incorrectas, debe git push --forcesobrescribirlas. Recuerda que git push --forcees algo muy peligroso, ¡así que asegúrate de que nadie se retire del servidor desde que presionaste los commits incorrectos!

¡Ahora ha cambiado sus mensajes de confirmación!

(Como puede ver, no tengo tanta experiencia en Vim, así que si usé la jerga incorrecta para explicar lo que está sucediendo, ¡no dude en corregirme!)

Marijn
fuente
44
<nitpick>No hay "hilos" en Stack Overflow, porque no es un foro de discusión, solo hay "preguntas", "respuestas" y "publicaciones". </nitpick>. Además, no todas las versiones de Vim son iguales, no todas te permitirán eliminar caracteres en modo de inserción (tiene sentido de alguna manera, ¿verdad?). Si desea poder eliminar siempre los caracteres en Vim, Xy xlo hará (los pequeños xcaracteres Xeliminados delante del cursor, se eliminarán detrás). Si comete errores, puede usar urepetidamente para deshacer. Finalmente, rse rewordabrevia en el editor interactivo de rebase.
1
Para cambiar una palabra en vim se cwescribe al principio (aunque la pregunta no es sobre vim, estoy de acuerdo).
Yaroslav Nikitenko
No necesitas usar esa abominación . Puede configurar su editor de git en algo sensato y fácil de usar, como nanomcedit de Midnight Commander.
Dan Dascalescu
79

Puedes usar git-rebase-reword

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

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

Se nombra después de la acción en rebase interactiva para enmendar un commit: "reword". Ver esta publicación y el modo interactivo de la sección man

Ejemplos:

$ git rebase-reword b68f560
$ git rebase-reword HEAD^
albfan
fuente
66
Esto requiere instalar un programa externo. En mi opinión, sería mejor aprender a usar las herramientas integradas y los alias de manera más efectiva. g c; g rb -i @~9Escribiría : (commit y rebase), movería el nuevo commit a donde lo quisiera, cambiaría commita f( fixup) y guardaría. Si querías algo más rápido que eso, podrías alias git commit --fixup=<commit>; git rebase -i --autosquash <commit>^
Zaz
79

He agregado los alias reciy recmpara recommit (amend)ello. Ahora puedo hacerlo con git recmo git recm -m:

$ vim ~/.gitconfig

[alias]

    ......
    cm = commit
    reci = commit --amend
    recm = commit --amend
    ......
Chu-Siang Lai
fuente
57

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

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

Advertencia: forzar sus cambios sobrescribirá la rama remota con la local. Asegúrese de no sobrescribir nada que quiera conservar. También tenga cuidado al forzar un compromiso modificado (reescrito) si alguien más comparte la rama con usted, porque necesitarán reescribir su propio historial si tienen la copia anterior del compromiso que acaba de reescribir.

neoneye
fuente
77
Nada se "sobrescribe" en git. En este caso, el puntero de la rama se establecerá en su nueva confirmación y la confirmación anterior quedará obsoleta si no le quedan referencias y podría limpiarse después de algunas semanas. (Hasta entonces, otros aún pueden encontrarlo y hacer referencia a él, por ejemplo, mirando el registro).
David Ongaro,
51

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>
Kedar Adhikari
fuente
46

Si no ha insertado el código en su rama 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á trabajando en una rama específica, haga esto:

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

Si ya presionó el código con el mensaje incorrecto y necesita tener cuidado al cambiar el mensaje. Es decir, después de cambiar el mensaje de confirmación e intentar presionarlo nuevamente, terminará teniendo problemas. Para suavizarlo, sigue estos pasos.

Por favor lea 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 el empuje forzado directamente, puede terminar con problemas de código que otros desarrolladores están trabajando en la misma rama. Entonces, para evitar esos conflictos, debe extraer el código de su rama antes de hacer que la fuerza 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 al cambiar el mensaje de confirmación, si ya se ha enviado.

Prabhakar Undurthi
fuente