¿Hay alguna manera de editar un mensaje de confirmación en GitHub?

129

¿Hay alguna manera de editar un mensaje de confirmación después de comprometerse y presionar a GitHub? Veo que hay un 'agregar una nota', así como comentarios en línea, pero no hay edición real de un mensaje de confirmación. También hay 'enmendar confirmación' en las extensiones de git, pero eso no edita el mensaje existente.

Matthew Peters
fuente
Puede intentar revertir la confirmación (vea algunas opciones en esta pregunta SO: stackoverflow.com/questions/4114095/… ) - ¡solo asegúrese de hacer una copia de seguridad de los cambios en el código para no perderlos por un comentario!
Travelling Tech Guy
Consulte también ¿Cómo edito un mensaje de confirmación incorrecto en Git? en desbordamiento de pila.
Arjan

Respuestas:

183
  1. git rebase -i <commit hash you want to change>^

    Esto abrirá su editor predeterminado (generalmente ) con una lista de confirmaciones y acciones para cada una. Por defecto, la acción es pick.

  2. Para cualquier confirmación que desee cambiar el mensaje, cambie picka reword.

  3. Guardar y salir (en vi:) :wq.

  4. Para cada confirmación, obtendrá un editor para editar el mensaje de confirmación. Cámbielo como mejor le parezca, guarde y salga.

    Una vez que haya terminado de editar todos los mensajes de confirmación, volverá al símbolo del sistema y tendrá un nuevo árbol con los mensajes actualizados.

  5. Ahora puedes subirlos a github usando git push origin --force.

Si solo necesita arreglar su último commit, puede reemplazar los pasos 1-4 con git commit --amend.

Mureinik
fuente
3
@MatthewPeters Supongo que debería haber una manera, pero no lo sé: uso la línea de comandos directamente.
Mureinik
44
No parece que pueda especificar <hash de compromiso que desea cambiar>, sino que necesita especificar el hash del compromiso anterior al que desea cambiar o usar HEAD ~ x donde x es el número de commits de HEAD donde el elemento que desea cambiar reside.
ssc327
3
@ ssc327 Tenga en cuenta que estoy ^allí; de hecho, le sugerí que se cambie el nombre del padre de la confirmación que desea cambiar.
Mureinik
2
@Murenik tienes razón, de alguna manera extrañé ver el ^
ssc327
1
@deadfish Usando la línea de comandos de Windows, debe escribir ^^para finalizar el comando con un literal, ^ por ejemplo: git rebase -i 2c747b32^^
Wyck
35

En Intellij Idea puedes hacerlo tan fácil.

  1. Control de versión abierta (historial)
  2. Seleccionar pestaña de registro
  3. Seleccione confirmar para cambiar el comentario
  4. presione F2 (Mac fn + F2) y actualice su mensaje de confirmación
fedrbodr
fuente
1
No funciona si ya presionó el control remoto.
pago
8
git push origin --forceLuego debe ejecutar como se sugiere en la respuesta de @ Mureinik.
Dan Macák
1
La opción "reword" está deshabilitada si ya se ha enviado la confirmación.
huyz
1
Para hacerlo con Intellij IDEA para una confirmación que se ha empujado, primero debe comenzar con un rebase interactivo (como lo haría desde la línea de comandos de Git). Para hacer el rebase, haga clic derecho en su proyecto -> elemento de menú "Git" -> "Repositorio" -> "rebase ..." (último elemento del menú). Inserte el SHA del commit antes del que desea modificar en el campo "En" y haga clic en "Rebase". Luego recibirá el mensaje de rebase interactivo. Seleccione "cambiar palabra" en el cuadro desplegable de acciones junto a los compromisos que desea modificar y haga clic en el botón "Iniciar rebase" (continúa en el siguiente comentario)
jplandrain
1
(continuación) A continuación, se le presentará un mensaje de texto para cada confirmación que desee modificar. Después de modificar los mensajes de registro, puede aplicar modificaciones adicionales (tenga en cuenta que ahora la opción "reword" ya no está atenuada). Cuando haya terminado, puede forzar las modificaciones para concluir el rebase interactivo. Todo el proceso es en realidad exactamente el mismo que en la respuesta de @Mureinik que lo está haciendo desde la línea de comandos.
jplandrain
3

Premisa:

si tu git-graph se parece a ...

O   target-commit that you want to change its message [df9c192]
|
O   parent-commit [b7ec061]
|
O

( df9c192y b7ec061son los hashes commit de target-commit y parent-commit, por separado)

Solución:

solo puede escribir las siguientes instrucciones ...

git reset --soft b7ec061
git commit -m "your_new_description"
git push -f

Explicación:

  1. git reset --soft b7ec061 mantendrá sus cambios de archivos y se restablecerá a parent-commit (es decir, b7ec061)
  2. git commit -m "..." creará localmente una nueva confirmación
  3. git push -f empujará su nueva confirmación al servidor y reemplazará la anterior (es decir, df9c192)
Alumi Lu
fuente
2

Otra opción es crear una "confirmación de erratas" adicional (y push) que haga referencia al objeto de confirmación que contiene el error; la nueva confirmación de erratas también proporciona la corrección. Una confirmación de errata es una confirmación sin cambios sustanciales de código pero con un mensaje de confirmación importante; por ejemplo, agregue un carácter de espacio a su archivo readme y confirme ese cambio con el mensaje de confirmación importante, o use la opción git --allow-empty. Ciertamente es más fácil y seguro que el rebase, no modifica el historial verdadero y mantiene limpio el árbol de la rama (usandoamendtambién es una buena opción si está corrigiendo la confirmación más reciente, pero una confirmación de erratas puede ser una buena opción para las confirmaciones anteriores). Este tipo de cosas rara vez sucede que simplemente documentar el error es lo suficientemente bueno. En el futuro, si necesita buscar en un registro git una palabra clave de función, la confirmación original (errónea) puede no aparecer porque se utilizó la palabra clave incorrecta en esa confirmación original (el error tipográfico original); sin embargo, la palabra clave aparecerá en la confirmación de erratas que luego te indicará la confirmación original que tenía el error tipográfico. Aquí hay un ejemplo:

$ git log
commit 0c28141c68adae276840f17ccd4766542c33cf1d
Autor: Primero Último 
Fecha: miércoles 8 de agosto 15:55:52 2018 -0600

    Errata cometer:
    Este commit no tiene un cambio sustancial de código.
    Esta confirmación se proporciona solo para documentar una corrección a un mensaje de confirmación anterior.
    Esto corresponde al objeto de confirmación e083a7abd8deb5776cb304fa13731a4182a24be1
    Mensaje de confirmación incorrecto original:
        Se cambió el color de fondo a rojo.
    Corrección (* cambio resaltado *):
        Se cambió el color de fondo a * azul *

commit 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4
Autor: Primero Último 
Fecha: miércoles 8 de agosto 15:43:16 2018 -0600

    Algún mensaje de confirmación provisional

commit e083a7abd8deb5776cb304fa13731a4182a24be1
Autor: Primero Último 
Fecha: miércoles 8 de agosto 13:31:32 2018 -0600

    Se cambió el color de fondo a rojo.
rob_7cc
fuente
Seguro que es seguro, pero hay mucho texto para leer. Prefiero reescribir la historia :)
pkalinow
0

La respuesta de @Mureinik es buena pero no comprensible para los novatos.

Primer método:

  1. Si solo desea editar el último mensaje de confirmación, entonces solo necesita git commit --amend, verá:
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# On branch is up to date with 'origin/master'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. Como puede ver, confirme el mensaje en la parte superior sin ningún prefijo de comando como pick, esta ya es la página de edición y puede editar directamente el mensaje superior y guardar y salir , por ejemplo:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. A continuación, realice git push -u origin master --forceo <how you push normally> --force. La clave aquí es --force.

Segundo método:

  1. Puede ver el hash de confirmación git logo extraer de la url del repositorio, el ejemplo en mi caso es881129d771219cfa29e6f6c2205851a2994a8835

  2. Entonces puedes hacer git rebase --interactive 881129d771219cfa29e6f6c2205851a2994a8835o git rebase -i HEAD^(si es lo último)

  3. Tu verias:

pick <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#  d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
  1. Pero si ve, noopentonces probablemente esté escribiendo mal, por ejemplo, si al final le git rebase -i 881129d771219cfa29e6f6c2205851a2994a88falta ^, es mejor que salga del editor sin guardar y descubra la razón:
noop

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
...
  1. Si no hay noopproblema, simplemente cambie la palabra picka reword, solo queda otra (no edita el mensaje de confirmación en este momento), por ejemplo:
reword <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
...
  1. Guardar y salir verá la página de edición similar al método # 1:
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# interactive rebase in progress; onto b057371
# Last command done (1 command done):
#    reword d996ffb <existing commit message foo bar>
# No commands remaining.
# You are currently editing a commit while rebasing branch 'master' on 'b057371'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. Edite el mensaje en la parte superior, igual que el método # 1 y guarde y salga, por ejemplo:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. De nuevo, igual que el método # 1, do git push -u origin master --forceo <how you push normally> --force. La clave aquí es --force.

Para obtener más información, lea el documento .

林果 皞
fuente