Cambiar el antiguo mensaje de confirmación en Git

136

Estaba tratando de editar un viejo mensaje de confirmación como se explica aquí .

Lo que pasa es que ahora, cuando trato de ejecutarlo rebase -i HEAD~5, dice interactive rebase already started.

Entonces lo intento: git rebase --continuepero recibí este error:

error: Ref refs/heads/master is at 7c1645b447a8ea86ee143dd08400710c419b945b but expected c7577b53d05c91026b9906b6d29c1cf44117d6ba
fatal: Cannot lock the ref 'refs/heads/master'.

¿Algunas ideas?

Pablo Fernández
fuente

Respuestas:

125

Dice:

Cuando guarde y salga del editor, lo rebobinará hasta la última confirmación en esa lista y lo colocará en la línea de comando con el siguiente mensaje:

$ git rebase -i HEAD~3
Stopped at 7482e0d... updated the gemspec to hopefully work better
You can amend the commit now, with

No significa:

Escriba otra vez git rebase -i HEAD~3

Intente no escribir git rebase -i HEAD~3al salir del editor, y debería funcionar bien.
(de lo contrario, en su situación particular, git rebase -i --abortpodría ser necesario restablecer todo y permitirle volver a intentarlo)


Como Dave Vogt menciona en los comentarios, git rebase --continuees para pasar a la siguiente tarea en el proceso de rebase, después de haber modificado la primera confirmación .

Además, Gregg Lind menciona en su respuesta el rewordcomando degit rebase :

Al reemplazar el comando "escoger" con el comando "editar", puede decir git rebase que se detenga después de aplicar esa confirmación, de modo que pueda editar los archivos y / o el mensaje de confirmación, modificar la confirmación y continuar el rebase.

Si solo desea editar el mensaje de confirmación para una confirmación, reemplace el comando " pick" con el comando " reword" , ya que Git1.6.6 (enero de 2010) .

Hace lo mismo ' edit' durante un rebase interactivo, excepto que solo le permite editar el mensaje de confirmación sin devolver el control al shell . Esto es extremadamente útil.
Actualmente, si desea limpiar sus mensajes de confirmación, debe:

$ git rebase -i next

Luego configure todos los commits para 'editar'. Luego en cada uno:

# Change the message in your editor.
$ git commit --amend
$ git rebase --continue

Usar ' reword' en lugar de ' edit' le permite omitir las llamadas git-commitygit-rebase .

VonC
fuente
2
Además, git rebase --continuepasa a la siguiente tarea en el proceso de rebase, después de haber modificado la primera confirmación.
Dave Vogt el
1
Agregar el enlace al artículo wiki de github para cambiar un mensaje de confirmación
Joy
60

Como sugirió Gregg Lind, puede usar la nueva palabra para que se le solicite que solo cambie el mensaje de confirmación (y deje la confirmación intacta de lo contrario):

git rebase -i HEAD~n

Aquí nestá la lista de los últimos n commits.

Por ejemplo, si usa git rebase -i HEAD~4, puede ver algo como esto:

pick e459d80 Do xyz
pick 0459045 Do something
pick 90fdeab Do something else
pick facecaf Do abc

Ahora reemplace pick con reword para los commits de los que desea editar los mensajes:

pick e459d80 Do xyz
reword 0459045 Do something
reword 90fdeab Do something else
pick facecaf Do abc

Salga del editor después de guardar el archivo, y luego se le pedirá que edite los mensajes para las confirmaciones que había marcado como reword , en un archivo por mensaje. Tenga en cuenta que hubiera sido mucho más sencillo simplemente editar los mensajes de confirmación cuando reemplazado pickcon reword, pero haciendo que no tiene ningún efecto.

Obtenga más información en la página de GitHub para Cambiar un mensaje de confirmación .

Punit Vara
fuente
Muy bien explicado. Gracias: D
Shubham Jain
Gracias @ShubhamJain Feliz de que mi respuesta haya sido útil
Punit Vara
Lo hice, y luego los compromisos de otras sucursales aparecen en mi sucursal
Reza
@Reza, podrías haber arruinado algo. Prueba esto en algún otro repositorio. Esta solución funciona perfectamente
Punit Vara
54

FWIW, git rebase interactive ahora tiene una opción de "reformulación", ¡lo que hace que esto sea mucho menos doloroso!

Gregg Lind
fuente
3
Cuando se usa reword, ¿por qué git simplemente no le permite editar los mensajes de confirmación en ese archivo con la lista de confirmaciones? En su lugar, iniciará el editor con un archivo de mensaje de confirmación por rewordlínea. Esto es simplemente innecesario. Incluso si otras acciones picko rewordrequieren el lanzamiento de comandos externos, rewordno lo necesitarían.
Dan Dascalescu
9

Solo quería proporcionar una opción diferente para esto. En mi caso, generalmente trabajo en mis sucursales individuales y luego me uno a master, y los compromisos individuales que hago con mi local no son tan importantes.

Debido a un gancho de git que verifica el número de boleto apropiado en Jira pero distingue entre mayúsculas y minúsculas, se me impidió presionar mi código. Además, el compromiso se realizó hace mucho tiempo y no quería contar cuántos compromisos volvería a la rebase.

Entonces, lo que hice fue crear una nueva rama desde el último maestro y aplastar todas las confirmaciones de la rama problemática en una sola confirmación en una nueva rama. Fue más fácil para mí y creo que es una buena idea tenerlo aquí como referencia futura.

Del último maestro:

git checkout -b new-branch

Luego

git merge --squash problem-branch
git commit -m "new message" 

Referencia: https://github.com/rotati/wiki/wiki/Git:-Combine-all-messy-commits-into-one-commit-before-merging-to-Master-branch

WebDever
fuente
1
Tu respuesta realmente me salvó el día :). Estuve luchando rebase -idurante unas 2 horas y no tuve éxito. Mi commit estaba detrás de 18 commits, por lo que te puedes imaginar. Esta fue la forma más simple y práctica que pude encontrar sin necesidad de usar rebase. ¡Gracias amigo!
Carlos Parra
6

Aquí hay una muy buena Gist que cubre todos los casos posibles: https://gist.github.com/nepsilon/156387acf9e1e72d48fa35c4fabef0b4

Visión general:

git rebase -i HEAD~X
# X is the number of commits to go back
# Move to the line of your commit, change pick into edit,
# then change your commit message:
git commit --amend
# Finish the rebase with:
git rebase --continue
Mahmoud Zalt
fuente