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/r
para editar el mensaje:Nota importante sobre rebase interactivo
Cuando lo usas
git rebase -i HEAD~n
puede 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 rerere
y 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 --amend
no es tan poderoso comogit rebase -i
.git commit --amend
puede arreglar la confirmación maestra (a?).git push -f origin branchname
git push -f
un 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_commit
Si 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ó.
pick
areword
(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 --amend
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 --interactive
permite 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
reword
en lugar depick
editar el mensaje de registro.$parent_of_flawed_commit
es 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 --amend
fuente
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 los commits elegidos como "reword" en lugar de "pick".git reset --hard
aniquila los cambios no comprometidos. Por favor reemplace--hard
con--soft
.git reset --hard
es un comando perfectamente legítimo, pero es engañoso dada la pregunta. ¡Usas--hard
si cometiste cambios que quieres tirar, no si cometiste un error tipográfico en el mensaje de confirmación!Como ya se mencionó,
git commit --amend
es la forma de sobrescribir la última confirmación. Una nota: si desea sobrescribir también los archivos , el comando seríafuente
git add file.ext
luego simplementegit commit --amend
También puedes usar
git filter-branch
para 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
HEAD
y el commit defectuoso, por lo que debe elegir sumsg-filter
comando con mucha prudencia ;-)fuente
$flawed_commit^..HEAD
no$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
-c
hace algunas cosas. Utiliza el mensaje antiguo por defecto, 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.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 --amend
tenido efecto, puede usarlogit show
y 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~3
algit rebase -i
comando:fuente
git commit --amend
, y también se dice que se puede usargit rebase -i HEAD~commit_count
, todo lo que hizo fue enchufe3
paracommit_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/
.-f
hará 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.--all
se 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 --amend
para arreglar los comentarios o añadir archivos se me olvidógit add
, pero sólo nunca antes hegit push
ed. También lo usogit filter-branch
cuando 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 --amend
respuesta 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 --amend
y modifique el mensaje de confirmación. Si desea retroceder antes de ese punto de confirmación, también puede usargit reflog
y simplemente eliminar esa confirmación. Entonces solo haces unagit commit
vez 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
pick
ar
(reword
) y guarde y cierre el archivo. ¡Hecho!Tutorial de Vim en miniatura (o cómo hacer un rebase con solo 8 teclas
3j
cw
r
EscZZ
):vimtutor
si tienes tiempoh
j
k
l
corresponden a teclas de movimiento ←↓↑→3j
mueve hacia abajo tres líneasi
para ingresar al modo de inserción: el texto que escriba aparecerá en el archivoc
para salir del modo insertar y volver al modo "normal"u
deshacerr
Rehacerdd
,dw
,dl
Para borrar una línea, palabra, o por carta, respectivamentecc
,cw
,cl
Para cambiar una línea, palabra, o por carta, respectivamente (lo mismo quedd
i
)yy
,yw
,yl
Copiar ( "tirón") una línea, palabra, o por carta, respectivamentep
oP
pegar después o antes de la posición actual, respectivamente:w
Enter guardar (escribir) un archivo:q!
Enter salir sin guardar:wq
EnteroZZ
para 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
--hard
y--force
aunque 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.ddjjpZZ
mueve 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/master
es 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
--soft
lugar de--hard
, de lo contrario perderá ese compromiso por completo.fuente
git commit --amend
excepto que es un proceso de 2 pasos.--amend
mantendrá 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/e
o 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
--only
bandera o su acceso directo-o
concommit --amend
:Esto asegura que no mejorará accidentalmente su confirmación con cosas preparadas. Por supuesto, es mejor tener una
$EDITOR
configuración adecuada . Luego puede dejar la-m
opció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-o
bandera probablemente estaría enterrada en el resto de la información. Tampoco me siento cómodo editando una respuesta que ya tiene tantos votos.--only
opción con--amend
está 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 reset
tambié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 reset
la 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
pick
que 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 enreword
lugar 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 --force
sobrescribirlas. Recuerda quegit push --force
es 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,X
yx
lo hará (los pequeñosx
caracteresX
eliminados delante del cursor, se eliminarán detrás). Si comete errores, puede usaru
repetidamente para deshacer. Finalmente,r
sereword
abrevia en el editor interactivo de rebase.cw
escribe al principio (aunque la pregunta no es sobre vim, estoy de acuerdo).nano
mcedit 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 --amend
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:
fuente
g c; g rb -i @~9
Escribiría : (commit y rebase), movería el nuevo commit a donde lo quisiera, cambiaríacommit
af
(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
reci
yrecm
pararecommit (amend)
ello. Ahora puedo hacerlo congit recm
ogit 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 status
git add --all
git 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