Escribí algo incorrecto en un mensaje de confirmación.
¿Cómo puedo cambiar el mensaje? El compromiso aún no se ha presionado.
Escribí algo incorrecto en un mensaje de confirmación.
¿Cómo puedo cambiar el mensaje? El compromiso aún no se ha presionado.
Respuestas:
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.)
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.
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/r
para editar el mensaje:
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 +.
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.
git commit --amend
no es tan poderoso como git 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.
git commit --amend -m "your new message"
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
a reword
(o en versiones anteriores de Git, a edit
) 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?
reword
en lugar de pick
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
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
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ía
git commit -a --amend -m "My new commit message"
git add file.ext
luego simplementegit commit --amend
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 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 su msg-filter
comando con mucha prudencia ;-)
$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:
git commit --amend -c <commit ID>
De lo contrario, habrá una nueva confirmación con una nueva ID de confirmación.
-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:
git commit -a --amend -m "My new commit message"
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.
git commit --amend
tenido efecto, puede usarlo git show
y le mostrará el nuevo mensaje.
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.
Si desea cambiar los últimos tres mensajes de confirmación, o cualquiera de los mensajes de confirmación hasta ese punto, proporcione HEAD~3
al git rebase -i
comando:
git rebase -i HEAD~3
git commit --amend
, y también se dice que se puede usar git rebase -i HEAD~commit_count
, todo lo que hizo fue enchufe 3
para commit_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 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/
.
-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 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.
--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
:
git checkout -b old_master refs/original/refs/heads/master
git commit --amend
para arreglar los comentarios o añadir archivos se me olvidó git add
, pero sólo nunca antes he git push
ed. También lo uso git 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
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
.
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.
Tienes un par de opciones aquí. Tu puedes hacer
git commit --amend
siempre y cuando sea tu último compromiso.
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 --amend
y modifique el mensaje de confirmación. Si desea retroceder antes de ese punto de confirmación, también puede usar git reflog
y simplemente eliminar esa confirmación. Entonces solo haces una git commit
vez más.
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 pick
a r
( 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
o P
pegar después o antes de la posición actual, respectivamente:w
Enter guardar (escribir) un archivo:q!
Enter salir sin guardar:wq
Entero ZZ
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:
$ 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 --hard
y --force
aunque pueden descartar datos.
* Además, no reescriba el historial en ninguna rama en la que esté colaborando.
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:
Commit/Amend Last Commit
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.
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 --soft
lugar de --hard
, de lo contrario perderá ese compromiso por completo.
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!
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>
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
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.
Si solo desea cambiar su último mensaje, debe usar la --only
bandera o su acceso directo -o
con 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 $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.
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:
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.
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.
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 usar git
. 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:
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 pick
que 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 reword
lugar 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 --force
sobrescribirlas. Recuerda que git 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!)
<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
y x
lo hará (los pequeños x
caracteres X
eliminados delante del cursor, se eliminarán detrás). Si comete errores, puede usar u
repetidamente para deshacer. Finalmente, r
se reword
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
$ 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^
g c; g rb -i @~9
Escribiría : (commit y rebase), movería el nuevo commit a donde lo quisiera, cambiaría commit
a 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>^
He agregado los alias reci
y recm
para recommit (amend)
ello. Ahora puedo hacerlo con git recm
o git recm -m
:
$ vim ~/.gitconfig
[alias]
......
cm = commit
reci = commit --amend
recm = commit --amend
......
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.
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>
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.