2011-02-17 16 views
63

En mi repositorio local, tengo una confirmación con un mensaje de confirmación incorrecto.Confirmación de empuje accidental: cambiar el mensaje de confirmación de Git

Ya he publicado el mensaje de confirmación incorrecto con git push.

Ahora el repositorio remoto (que está alojado en GitHub) también tiene el mensaje de confirmación incorrecto.

Ya he intentado git commit --amend, pero descubrí que no funcionaría en esta situación porque he realizado confirmaciones adicionales desde la incorrecta.

¿Cómo solucionarías esta situación?

+0

complication (?): Hay otras confirmaciones después de 'screwed' (publicado por mí) – jonny

+0

¿No es esto un duplicado de [¿Cómo envío el compromiso modificado al repositorio de git remoto?] (Http: // stackoverflow .com/preguntas/253055/cómo-do-i-push-modificado-entrega-a-la-distancia-git-repo)? –

Respuesta

89

solución más fácil (pero por favor leer toda esta respuesta antes de hacer esto):

  1. git rebase -i <hash-of-commit-preceding-the-incorrect-one>
  2. En el editor que se abre, cambiar pick a reword en la línea por la incorrecta confirmación.
  3. Guarde el archivo y cierre el editor.
  4. El editor se abrirá nuevamente con el mensaje de confirmación incorrecto. Arreglalo.
  5. Guarde el archivo y cierre el editor.
  6. git push --force para actualizar GitHub.

Esto significa que va a publicar una versión modificada de un repositorio publicado anteriormente. Si alguien sacó o sacó de su repositorio desde cuando cometió el error con el mensaje de confirmación incorrecto, y cuando lo arregló, entonces experimentarán algunas dificultades más adelante. Así que asegúrese de poder aceptar esta consecuencia antes de intentar esto.

+0

ya que este es el proyecto de mi casa, esta será una buena solución. ¡Gracias! – jonny

+0

No estoy de acuerdo con que este sea el método más simple. – Abizern

+0

Ah. No vi la información adicional proporcionada en el comentario del OP. – Abizern

33

En lugar de ir todo el recorrido de rebase por un commit:

git reset --soft head~ 
git commit -m "The message you wanted to use" 
git push -f 

se puede ver las opciones de la página de manual git-reset.

Para un proyecto en el que solo usted está trabajando, el historial modificado no debería ser un problema.

+5

Al hacerlo perderá toda la información de confirmación (pero no el contenido) de las confirmaciones que se realizaron después de la confirmación "atornillada". Todos los commit posteriores serán agrupados en un gran commit. –

+10

Sin embargo, esto es muy útil solo para una confirmación. – jonny

+2

De acuerdo. No es una buena solución para la pregunta en cuestión, pero es extremadamente útil cuando te das cuenta inmediatamente de que necesitas ajustar tu último compromiso. Una palabra de advertencia, al presionar con '-f' como este, asegúrese de que hace referencia explícita a la rama de destino o que no tiene otras ramas que romperán lo que está en sentido ascendente. –

5

Si tiene que cambiar un mensaje de confirmación de edad a través de múltiples ramas (es decir, el envío de datos con el mensaje erróneo está presente en múltiples ramas) es posible que desee utilizar

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

para reemplazar el mensaje de confirmación.

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 exigirá 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 soltar esta bandera.

-- separa las opciones de filtro de la rama de opciones de revisión

--all se asegurará de que todas las ramas y etiquetas se vuelven a escribir.

Debido a la reserva de sus viejas referencias, puede fácilmente volver al estado anterior a la ejecución del comando.

Say, que desea recuperar su maestro y acceder a ella en la rama old_master:

git checkout -b old_master refs/original/refs/heads/master 

Una vez que esté satisfecho con los cambios utilizan git push -f para empujar los cambios a tu repositorio público.

en cuenta que debe informar a sus colaboradores sobre esto ya que todos los hashes de las confirmaciones de comenzar con la primera modificación se han cambiado.

2

Si usted no está empujado el código para su sucursal remota (Github/Bitbucket) puede cambiar el mensaje de confirmación en la línea de comandos de la siguiente manera.

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 ha empujado el código con el mensaje equivocado, entonces tienes que tener cuidado al cambiar el mensaje. Es decir, después de cambiar el mensaje de confirmación e intentar volver a presionarlo, terminará teniendo problemas. Para hacerlo sin problemas, siga estos pasos. Por favor, lea toda la respuesta 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 se utiliza el empuje fuerza directamente que podría terminar con problemas de código que otros desarrolladores están trabajando en la misma rama. Así que para evitar que los conflictos que necesita para sacar el código de la sucursal antes de hacer el empuje 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 cuando se cambia el mensaje de confirmación, si ya fue empujado.

Cuestiones relacionadas