Escribí algo incorrecto en un mensaje de confirmación.
¿Cómo puedo cambiar el mensaje? El compromiso aún no se ha presionado.
git
git-commit
git-rewrite-history
amend
Laurie Young
fuente
fuente

Respuestas:
Modificando el mensaje de confirmación más reciente
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:
... 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:
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:
Una vez que aplaste sus commits, elija el
e/rpara editar el mensaje: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
Página del manual de git-commit (1)
Página del manual de git-rebase (1)
Página del manual de git-push (1)
fuente
git commit --amendno es tan poderoso comogit rebase -i.git commit --amendpuede arreglar la confirmación maestra (a?).git push -f origin branchnamegit push -fun poco peligroso si otras personas están usando el mismo repositorio?git commit --amend -c HEAD. Esto abrirá el editor rellenado previamente con su antiguo mensaje de confirmación, para que pueda cambiarlo.fuente
Si la confirmación que desea corregir no es la más reciente:
git rebase --interactive $parent_of_flawed_commitSi desea corregir varios commits defectuosos, pase el padre del más antiguo de ellos.
Aparecerá un editor, con una lista de todas las confirmaciones desde la que usted proporcionó.
pickareword(o en versiones anteriores de Git, aedit) delante de cualquier confirmación que desee corregir.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:
git commit --amendgit rebase --continueLa 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?
fuente
reworden lugar depickeditar el mensaje de registro.$parent_of_flawed_commites equivalente a$flawed_commit^.-p(--preserve-merges) si hubo una fusión después de la confirmación defectuosa.Para modificar la confirmación anterior, realice los cambios que desee y organice esos cambios, y luego ejecute
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
Para corregir la confirmación anterior eliminándola por completo, ejecute
Si desea editar más de un mensaje de confirmación, ejecute
(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
Nota: También puede "Realizar el cambio que desee" desde el editor abierto por
git commit --amendfuente
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".git reset --hardaniquila los cambios no comprometidos. Por favor reemplace--hardcon--soft.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!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íafuente
git add file.extluego simplementegit commit --amendTambién puedes usar
git filter-branchpara eso.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 sumsg-filtercomando con mucha prudencia ;-)fuente
$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á). »Prefiero de esta manera:
De lo contrario, habrá una nueva confirmación con una nueva ID de confirmación.
fuente
-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.fatal: Option -m cannot be combined with -c/-C/-F/--fixup.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:
fuente
Puedes usar Git rebasing . Por ejemplo, si desea volver a modificar para confirmar bbc643cd, ejecute
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
Ahora puedes usar
para modificar la confirmación, y después de eso
para volver al commit principal anterior.
fuente
git commit --amendtenido efecto, puede usarlogit showy le mostrará el nuevo mensaje.Si solo desea modificar su último mensaje de confirmación, haga lo siguiente:
Eso lo colocará en su editor de texto y le permitirá cambiar el último mensaje de confirmación.
Si desea cambiar los últimos tres mensajes de confirmación, o cualquiera de los mensajes de confirmación hasta ese punto, proporcione
HEAD~3algit rebase -icomando:fuente
git commit --amend, y también se dice que se puede usargit rebase -i HEAD~commit_count, todo lo que hizo fue enchufe3paracommit_count.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 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 enrefs/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:fuente
git commit --amendpara arreglar los comentarios o añadir archivos se me olvidógit add, pero sólo nunca antes hegit pushed. También lo usogit 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!Utilizar
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.fuente
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.Enmendar
Tienes un par de opciones aquí. Tu puedes hacer
siempre y cuando sea tu último compromiso.
Rebase interactivo
De lo contrario, si no es su último commit, puede hacer un rebase interactivo,
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 usargit reflogy simplemente eliminar esa confirmación. Entonces solo haces unagit commitvez más.fuente
Si es su última confirmación, solo modifique la confirmación:
(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 :
Encuentre la confirmación que desea, cambie
pickar(reword) y guarde y cierre el archivo. ¡Hecho!Tutorial de Vim en miniatura (o cómo hacer un rebase con solo 8 teclas
3jcwrEscZZ):vimtutorsi tienes tiempohjklcorresponden a teclas de movimiento ←↓↑→3jmueve hacia abajo tres líneasipara ingresar al modo de inserción: el texto que escriba aparecerá en el archivocpara salir del modo insertar y volver al modo "normal"udeshacerrRehacerdd,dw,dlPara borrar una línea, palabra, o por carta, respectivamentecc,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, respectivamentepoPpegar después o antes de la posición actual, respectivamente:wEnter guardar (escribir) un archivo:q!Enter salir sin guardar:wqEnteroZZpara guardar y salirSi 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:
* 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.fuente
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.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.Si está utilizando la GUI de Git, puede modificar la última confirmación que no se ha enviado con:
fuente
Uso la GUI de Git tanto como puedo, y eso te da la opción de modificar la última confirmación:
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.fuente
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í:
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.fuente
git commit --amendexcepto que es un proceso de 2 pasos.--amendmantendrá la información del autor, pero la pregunta solo pide cambiar el mensaje.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.
Para confirmaciones que aún no se han enviado a un control remoto:
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!fuente
Si solo desea editar la última confirmación, use:
o
Pero si desea editar varias confirmaciones seguidas, en su lugar, debe usar rebase:
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
Guarde y salga de eso y escriba
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.
fuente
Si solo desea cambiar su último mensaje, debe usar la
--onlybandera o su acceso directo-oconcommit --amend: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.fuente
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.--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.Actualice su último mensaje de confirmación incorrecto con el nuevo mensaje de confirmación en una línea:
O prueba Git reset como a continuación:
Uso de reset para dividir commits en commits más pequeños
git resettambién puede ayudarte a dividir una confirmación en varias confirmaciones:Aquí ha dividido con éxito su última confirmación en dos confirmaciones.
fuente
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.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 usargit. A veces, esto puede ser realmente útil. :)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:
* 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:
En lugar de
pickque necesites escribirreword. Puede hacer esto en Vim escribiendoi. 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 enrewordlugar depick.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 eswq. 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 quegit 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!)
fuente
<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,Xyxlo hará (los pequeñosxcaracteresXeliminados delante del cursor, se eliminarán detrás). Si comete errores, puede usarurepetidamente para deshacer. Finalmente,rserewordabrevia en el editor interactivo de rebase.cwescribe al principio (aunque la pregunta no es sobre vim, estoy de acuerdo).nanomcedit de Midnight Commander.Puedes usar git-rebase-reword
Está diseñado para editar cualquier confirmación (no solo la última) de la misma manera que
commit --amendSe 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:
fuente
g c; g rb -i @~9Escribiría : (commit y rebase), movería el nuevo commit a donde lo quisiera, cambiaríacommitaf(fixup) y guardaría. Si querías algo más rápido que eso, podrías aliasgit commit --fixup=<commit>; git rebase -i --autosquash <commit>^He agregado los alias
reciyrecmpararecommit (amend)ello. Ahora puedo hacerlo congit recmogit recm -m:fuente
Me di cuenta de que había empujado un commit con un error tipográfico. Para deshacer, hice lo siguiente:
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.
fuente
Me gusta usar lo siguiente:
git statusgit add --allgit commit -am "message goes here about the change"git pull <origin master>git push <origin master>fuente
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.
Si está trabajando en una rama específica, haga esto:
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.
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 :
Esta es la mejor práctica al cambiar el mensaje de confirmación, si ya se ha enviado.
fuente