git - change - ¿Cómo modificar los compromisos existentes, sin pulir?
git rebase (27)
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 establecer el mensaje de confirmación directamente en la línea de comandos 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 complicados de ingresar.
Asegúrese de que no haya cambios de copia de trabajo en escena antes de hacer esto o se confirmarán también. (Los cambios no programados no se confirmarán).
Cambiar el mensaje de una confirmación que ya ha enviado a su sucursal remota
Si ya ha enviado su compromiso a su rama remota, entonces deberá forzar el envío del compromiso con:
git push <remote> <branch> --force
# Or
git push <remote> <branch> -f
Advertencia: el empuje forzado sobrescribirá la rama remota con el estado de la local . Si hay confirmaciones en la sucursal remota que no tiene en su sucursal local, perderá esas confirmaciones.
Advertencia: tenga cuidado al modificar los compromisos que ya ha compartido con otras personas. Los compromisos de modificación esencialmente los reescriben para que tengan diferentes ID de SHA , lo que plantea un problema si otras personas tienen copias del compromiso anterior que usted ha reescrito. Cualquier persona que tenga una copia del compromiso anterior tendrá que sincronizar su trabajo con su nuevo compromiso reescrito, lo que a veces puede ser difícil, así que asegúrese de coordinar con otros cuando intente reescribir el historial de confirmaciones compartidas, o simplemente evite volver a escribir confirmaciones compartidas en total.
Utilice 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 un git squash, 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 aplastas tus compromisos, elige la e/r
para editar el mensaje
Nota importante sobre rebase interactivo
Cuando usa git rebase -i HEAD~X
, puede haber más de X
confirmaciones. Git "recopilará" todos los confirmaciones en las últimas X
confirmaciones y si hubo una fusión en algún punto entre ese rango, también verás todas las confirmaciones para que el resultado sea X +.
Buen consejo:
Si tiene que hacerlo por más de una rama y podría enfrentar conflictos al modificar el contenido, configure git rerere
y deje que git resuelva esos conflictos automáticamente.
🔥 punta caliente
También puede escribir una pequeña función de bash para enmendar el último mensaje de confirmación de git y enviarlo al control remoto. Me ayuda todo el tiempo. Aquí está la función; póngalo en su archivo .bashrc
o similar .zshrc
y vuelva a cargar su shell.
# Amend the last commit message
# Push the changes to remote by force
# USAGE: gamend "Your New Commit Msg"
function gamend() {
git commit --amend -m "$@"
git push --force
}
Documentación
Escribí lo incorrecto en un mensaje de confirmación. Alternativamente, he olvidado incluir algunos archivos.
¿Cómo puedo cambiar el mensaje / archivos de confirmación? El compromiso no ha sido empujado todavía.
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 solo haces un git commit
nuevo.
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.
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 comandogit rebase -i
:git rebase -i HEAD~3
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 confirmaciones en confirmaciones más pequeñas
git reset
puede ayudarte a dividir un commit en múltiples commit 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.
Como ya se mencionó, git commit --amend
es la manera de sobrescribir el último commit. Una nota: si desea también sobrescribir los archivos , el comando sería
git commit -a --amend -m "My new commit message"
En esta pregunta hay muchas respuestas, pero ninguna de ellas explica con gran detalle cómo cambiar los mensajes de confirmación más antiguos utilizando VIM. Me quedé atascado tratando de hacer esto yo mismo, así que aquí voy a anotar en detalle cómo lo hice, 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 cambiarla de esta manera:
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í donde puede "editar" su historial de confirmación. Verás tus últimos 5 confirmaciones en la parte superior así:
pick <commit hash> commit message
En lugar de pick
necesitas escribir una reword
. Puedes hacer esto en VIM escribiendo i
, que te hace entrar al modo INSERT. (Verá que está en el 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 en ''modo de comando'' presionando el botón esc. (puede verificar que está en modo comando si la palabra INSERTAR ha desaparecido). Luego puede escribir un comando escribiendo :
el comando para guardar y salir es wq
. Así que si :wq
estás en el camino correcto.
Luego, VIM repasará todos los mensajes de confirmación que desee reformular, 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. ¡Haz esto 5 veces y te quedas sin VIM!
Entonces, si ya presionaste tus confirmaciones erróneas, necesitas git push --force
sobreescribirlas. Recuerda que git push --force
es algo muy peligroso de hacer, así que asegúrate de que nadie haya salido del servidor desde que hiciste los errores incorrectos.
¡Ahora has cambiado tus mensajes de confirmación!
(Como ves, no tengo tanta experiencia en VIM, así que si utilizo la ''jerga'' incorrecta para explicar lo que está sucediendo, ¡siéntete libre de corregirme!)
He añadido el alias de reci
, recm
para recm
a recommit (amend)
, ahora puedo hacerlo con git recm
o git recm -m
.
$ vim ~/.gitconfig
[alias]
......
cm = commit
reci = commit --amend
recm = commit --amend
......
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.
Para confirmaciones que aún no se han enviado a un control remoto:
- Asegúrese de haber confirmado o ocultado todos los cambios actuales (es decir, no hay archivos enumerados en la pestaña "Estado del archivo"), de lo contrario no funcionará.
- 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 debajo de los compromisos que desea editar y seleccione "Rebase children of <commit ref> interactively ..."
- Seleccione la fila completa para el mensaje de confirmación que desea cambiar ( es decir, haga clic en la columna "Mensaje" ).
- Haga clic en el botón "Editar mensaje".
- Edite el mensaje como desee en el cuadro de diálogo que aparece y luego haga clic en Aceptar.
- Repita los pasos 3-4 si hay otros mensajes de confirmación para cambiar.
- 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 de esta respuesta , que son similares a los de arriba, pero requieren que se ejecute un comando adicional desde la línea de comandos para forzar el empuje de la rama: léalo todo y aplique la precaución necesaria.
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
(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: puede "Hacer el cambio que desee" también desde el editor abierto por git commit --amend
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.
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 interactivo para enmendar un commit: "reword". Ver este post y el modo interactivo de la sección man .
Ejemplos:
$ git rebase-reword b68f560
$ git rebase-reword HEAD^
Si el compromiso que quieres arreglar no es el más reciente:
git rebase --interactive $parent_of_flawed_commit
Si desea corregir varias confirmaciones defectuosas, pase el padre de la más antigua de ellas.
Aparecerá un editor, con una lista de todas las confirmaciones desde la que dio.
- Cambie
pick
toreword
(o en versiones anteriores de Git, paraedit
) delante de cualquier confirmación que desee corregir. - Una vez que guarde, Git volverá a reproducir las confirmaciones enumeradas.
- Cambie
Para cada confirmación que desee reformular , Git lo devolverá a su editor. Para cada confirmación que desea editar , Git lo coloca en el shell. Si estás en la cáscara:
- Cambia el commit de la forma que quieras.
-
git commit --amend
-
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
permite corregir los compromisos 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?
Si es su última confirmación, simplemente modifique la confirmación:
git commit --amend -o -m "New commit message"
(utilizando el --only
-o
( --only
) para asegurarse de que solo cambia el mensaje de confirmación)
Si es un compromiso enterrado, 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 la pick
a r
( reword
) y guarde y cierre el archivo. ¡Hecho!
Miniatura vim tutorial (o, cómo volver a basear con sólo 8 pulsaciones de tecla 3j
cw
r
Esc ZZ
):
- Ejecuta
vimtutor
si tienes tiempo -
h
j
k
l
corresponde a las teclas de movimiento ← ↓ ↑ → - Todos los comandos se pueden prefijar con un "rango", por ejemplo,
3j
mueve hacia abajo 3 líneas - Para ingresar al modo de inserción, el texto que escriba aparecerá en el archivo.
- Esc o Ctrl
c
para salir del modo de inserción y volver al modo "normal" -
u
para deshacer - Ctrl
r
para rehacer -
dd
,dw
,dl
para eliminar una línea, palabra o letra, respectivamente -
cc
,cw
,cl
para cambiar una línea, palabra o letra, respectivamente (igual quedd
i
) -
yy
,yw
,yl
para copiar ("tirar") una línea, palabra o letra, respectivamente -
p
oP
para pegar después, o antes de la posición actual, respectivamente -
:w
Entrar para guardar (escribir) un archivo -
:q!
Ingrese para salir sin guardar -
:wq
Enter oZZ
para guardar y salir
Si edita mucho el texto, cambie a la distribución del teclado Dvorak, aprenda a teclear y aprenda 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 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 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.
Si está utilizando la GUI de Git, puede modificar la última confirmación que no se haya enviado con:
Commit/Amend Last Commit
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"
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.
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 usar la rebasación en su lugar:
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 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 hashes SHA después de ese compromiso en particular.
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, realizará copias de seguridad de referencias antiguas en 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, puedes quitar esta bandera.--
separa las opciones de rama de filtro de las opciones de revisión.--all
se asegurarán, que todas las ramas y etiquetas sean reescritas.
Debido a la copia de seguridad de sus referencias anteriores, puede volver fácilmente al estado antes de ejecutar el comando.
Digamos que quieres recuperar tu maestro y acceder a él en la rama old_master
:
git checkout -b old_master refs/original/refs/heads/master
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 una git commit --amend
trivial, 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 confirmación entre HEAD
y la confirmación defectuosa, por lo que debe elegir su comando msg-filter
muy sabio ;-)
Utilizar
git commit --amend
Para entenderlo en detalle, una excelente publicación es 4. Reescribiendo el historial de Git . También habla sobre cuándo no usar git commit --amend
.
Utilizo 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 mostrará los compromisos que has hecho sobre el maestro, y te da la opción de corregir, eliminar, reordenar o aplastar. No hay necesidad de conseguir ese hash primero.
Wow, entonces hay muchas maneras de hacer esto.
Otra forma de hacerlo es eliminar el último compromiso, 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 especificar --soft
lugar de --hard
, de lo contrario perderá ese compromiso por completo.
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.
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>
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 tenga cuidado de forzar la aplicación 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.
Si no ha introducido 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, siga 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 la fuerza de empuje 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 sucursal antes de presionar a la fuerza :
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.
git commit --amend -m "your new message"