it-swarm-es.com

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

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

¿Cómo puedo cambiar el mensaje? El compromiso no ha sido empujado todavía.

7673
Laurie Young

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 ningún cambio de copia de trabajo organizado antes de hacer esto o se comprometerán también. ( Los cambios sin clasificar no se confirmarán).

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 necesitará forzar la confirmación con:

_git Push <remote> <branch> --force
# Or
git Push <remote> <branch> -f
_

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

Advertencia: tenga cuidado al modificar los compromisos que ya ha compartido con otras personas. Los compromisos de modificación esencialmente reescribe que tengan ID de SHA diferentes, lo que plantea un problema si otras personas tienen copias de la confirmación anterior que 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 los demás cuando intente reescribir el historial de confirmación compartido, o simplemente evite volver a escribir confirmaciones compartidas en total.


Usar 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:

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

Una vez que aplaste sus confirmaciones, elija _e/r_ para editar el mensaje

enter image description here

Nota importante sobre rebase interactivo

Cuando usa _git rebase -i HEAD~X_ puede haber más que las confirmaciones X. Git "recopilará" todos los commits en los últimos X 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á X +.

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.


Documentación

15489
EfForEffort
git commit --amend -m "your new message"
2458
lfx_cool

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

  1. git rebase --interactive $parent_of_flawed_commit

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

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

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

  3. Para cada confirmación que desee reword , Git lo devolverá a su editor. Para cada confirmación que desee editar , Git lo coloca en el Shell. Si estás en la Shell:

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

La mayor parte de esta secuencia le será explicada por la salida de los diversos comandos a medida que avanza. Es muy fácil, no necesita memorizarlo, solo recuerde que git rebase --interactive le permite corregir las confirmaciones sin importar cuánto tiempo pasaron.


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

2330

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

git commit --amend

Esto abrirá un archivo en su editor de texto que representa su nuevo mensaje de confirmación. Comienza rellenado con el texto de su antiguo mensaje de confirmación. Cambie el mensaje de confirmación 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

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

git commit --amend
git rebase --continue

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

762
Fatih

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

git commit -a --amend -m "My new commit message"
392
John

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

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

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

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

352
Mark

Yo prefiero de esta manera.

git commit --amend -c <commit ID>

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

312
krevedko

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

O usa este comando desde una consola/terminal:

git commit -a --amend -m "My new commit message"
310
Akhilraj N S

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

$ git rebase bbc643cd^ --interactive

En el editor predeterminado, modifique 'elegir' para 'editar' en la línea cuyo compromiso desea modificar. Haz tus cambios y luego ponlos en escena con

$ git add <filepattern>

Ahora puedes usar

$ git commit --amend

para modificar el commit, y después de eso.

$ git rebase --continue

para volver a la cabeza anterior cometer.

282
Shoaib Ud-Din
  1. Si solo desea modificar su último mensaje de confirmación, haga lo siguiente:

    git commit --amend
    

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

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

    git rebase -i HEAD~3
    
275
Heena Hussain

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

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

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

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

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

  • --all se asegurará de que todos los 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
258
sebers

Utilizar

git commit --amend

Para entenderlo en detalle, una publicación excelente es 4. Reescritura del historial de Git. También habla de cuando no se usa git commit --amend.

221
skin

Enmendar

Tienes un par de opciones aquí. Tu puedes hacer

git commit --amend

siempre y cuando sea su último compromiso.

Rebase interactiva

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

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

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

195
wallerjake

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

Commit/Amend Last Commit
183
gulchrider

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

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

(usando el indicador -o (--only) para asegurarse de que solo cambia el mensaje de confirmación)


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

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

Encuentre la confirmación que desea, cambie picka r(rewordname__), y guarde y cierre el archivo. ¡Hecho!



Tutorial de VIM en miniatura (o cómo hacer un cambio de fase con solo 8 pulsaciones) 3jcwname__rname__EscZZname__):

  • Ejecuta vimtutorsi tienes tiempo
  • hname__jname__kname__lname__ corresponde a las teclas de movimiento 
  • Todos los comandos se pueden prefijar con un "rango", p. Ej. 3j baja 3 lineas
  • iname__ para ingresar al modo de inserción: el texto que escriba aparecerá en el archivo
  • Esc o Ctrlcname__ para salir del modo de inserción y volver al modo "normal"
  • uname__ deshacer
  • Ctrlrname__ Rehacer
  • ddname__dwname__dlname__ para borrar una línea, palabra o letra, respectivamente
  • ccname__cwname__clname__ para cambiar una línea, palabra o letra, respectivamente (igual que ddname__iname__)
  • yyname__ywname__ylname__ para copiar ("tirar") una línea, palabra o letra, respectivamente
  • pname__ o Pname__ para pegar después, o antes de la posición actual, respectivamente
  • :wEnter guardar (escribir) un archivo
  • :q!Enter para dejar de fumar sin guardar
  • :wqEnter o ZZname__ para guardar y dejar

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



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

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

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

172
Zaz

Utilizo Git GUI tanto como puedo, y eso te da la opción de modificar el último commit:

Tick that box

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

165
Havard Graff

Wow, entonces hay muchas maneras de hacer esto.

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

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

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

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

135
Radu Murzea

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

SourceTree interactive rebase

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

  1. Asegúrese de haber confirmado o guardado todos los cambios actuales (es decir, para que no haya archivos enumerados en la pestaña "Estado del archivo"), de lo contrario no funcionará.
  2. En la pestaña "Registro/Historial", haga clic con el botón derecho en la entrada con una línea contigua en el gráfico uno abajo los comités que desea editar y seleccione "Rebase children of <commit ref > interactivamente ... "
  3. Seleccione la fila completa para el mensaje de confirmación que desea cambiar (es decir, haga clic en la columna "Mensaje").
  4. Haga clic en el botón "Editar mensaje".
  5. Edite el mensaje como desee en el cuadro de diálogo que aparece y luego haga clic en Aceptar.
  6. Repita los pasos 3-4 si hay otros mensajes de confirmación para cambiar.
  7. Haga clic en Aceptar: Comenzará la rebase. Si todo está bien, la salida terminará "Completado con éxito".

... O ... para confirmaciones que ya han sido empujadas:

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

125
Steve Chambers

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

git commit --amend

o

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

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

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

git rebase editing

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

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

git commit --amend

guarda y sal de eso y escribe

git rebase --continue 

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

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

124

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

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

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

123
David Ongaro

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

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

O, intente git reset como abajo:

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

# it will reset you last commit. Now, you
# can re-commit it with new commit message.

Usando reset para dividir las confirmaciones en confirmaciones más pequeñas

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

# reset your head. I am resetting to last commits:
git reset --soft HEAD^
# (you can reset multiple commit by doing HEAD~2(no. of commits)

# Now, reset your head for splitting it to multiple commits
git reset HEAD

# add and commit your files seperately to make multiple commits: e.g
git add app/
git commit -m "add all files in app directory"

git add config/
git commit -m "add all files in config directory"

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

99
przbadu

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

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

Digamos que quiere cambiar sus cinco últimas confirmaciones, luego escriba esto en el terminal:

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

Este comando lo llevará a VIM allí puede "editar" su historial de confirmación. Verás tus últimas 5 confirmaciones en la parte superior así:

pick <commit hash> commit message

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

Luego, debe guardar y salir de esta pantalla; para hacerlo, primero ingrese al 'modo de comando' presionando el botón esc. (puedes verificar que estás en modo comando si la palabra INSERT en la parte inferior ha desaparecido) Luego puedes escribir un comando escribiendo :, el comando para guardar y salir es wq. Así que si escribes :wq estás en el camino correcto.

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

Luego, si ya presionaste tus confirmaciones erróneas, necesitas git Push --force para sobrescribirlas. Recuerda que git Push --force es algo muy peligroso de hacer, así que asegúrate de que nadie haya salido del servidor, ya que presionaste tus errores incorrectos.

¡Ahora has cambiado tus mensajes de confirmación!

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

82
Marijn

Puedes usar git-rebase-reword

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

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

Se nombra después de la acción en rebase interactivo para enmendar un commit: "reword". Ver este post y man sección-modo interactivo-

Ejemplos:

$ git rebase-reword b68f560
$ git rebase-reword HEAD^
76
albfan

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

$ vim ~/.gitconfig

[alias]

    ......
    cm = commit
    reci = commit --amend
    recm = commit --amend
    ......
76
Chu-Siang Lai

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

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

Advertencia: forzar la inserción de los cambios sobrescribirá la rama remota con la local. Asegúrese de que no va a sobrescribir nada de lo que desea conservar. También sea cauteloso al forzar el envío de un compromiso modificado (reescrito) si alguien más comparte la sucursal con usted, ya que tendrán que volver a escribir su propio historial si tienen la copia antigua del compromiso que acaba de reescribir.

54
neoneye

Me gusta usar lo siguiente:

  1. git status
  2. git add --all
  3. git commit -am "message goes here about the change"
  4. git pull <Origin master>
  5. git Push <Origin master>
49
Kedar Adhikari

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

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

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

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

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

Por favor lee mi respuesta completa antes de hacerlo.

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

git Push -f Origin BRANCH-NAME                # Not a best practice. Read below why?

Nota importante: Cuando usa el push de force directamente puede terminar con problemas de código que otros desarrolladores están trabajando en la misma rama. Por lo tanto, para evitar esos conflictos, debe extraer el código de su rama antes de realizar force Push :

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull Origin BRANCH-NAME
 git Push -f Origin BRANCH-NAME

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

43
Prabhakar