Pregunta Eliminar confirmaciones de una sucursal en Git


Me gustaría saber cómo eliminar una confirmación.

Por delete, Quiero decir que es como si no me hubiera comprometido, y cuando hago un esfuerzo en el futuro, mis cambios no llegarán a la rama remota.

Leí la ayuda de git, y creo que el comando que debería usar es git reset --hard HEAD. ¿Es esto correcto?


2574
2017-08-27 03:39


origen


Respuestas:


Cuidadoso:  git reset --hard  ELIMINARÁ SUS CAMBIOS EN EL DIRECTORIO DE TRABAJO. Asegúrate de esconde cualquier cambio local que quieras mantener antes de ejecutar este comando.

Asumiendo que estás sentado en ese compromiso, entonces este comando lo va a sacudir ...

git reset --hard HEAD~1

los HEAD~1 significa el compromiso antes de la cabeza.

O bien, podría ver el resultado de git log, encuentre la identificación de confirmación de la confirmación a la que desea hacer una copia de seguridad y luego haga lo siguiente:

git reset --hard <sha1-commit-id>

Si ya lo presionó, tendrá que hacer un esfuerzo de fuerza para deshacerse de él ...

git push origin HEAD --force

sin embargo, si otros pueden haberlo sacado, entonces sería mejor que comenzaras una nueva sucursal. Porque cuando tiran, simplemente lo fusionará en su trabajo, y lo subirán nuevamente.

Si ya presionó, puede ser mejor usar git revert, para crear una confirmación de "imagen especular" que deshará los cambios. Sin embargo, ambos commits estarán en el log.


FYI - git reset --hard HEAD es genial si quieres deshacerte de WORK IN PROGRESS. Lo restablecerá a la confirmación más reciente y borrará todos los cambios en su árbol de trabajo e índice.


Por último, si necesita encontrar un compromiso que haya "eliminado", generalmente está presente en git reflog a menos que tenga basura recolectada en su repositorio.


3305
2017-08-27 03:44



Si aún no ha enviado el commit a ninguna parte, puede usar git rebase -i para eliminar ese compromiso. Primero, descubra qué tan atrás está esa confirmación (aproximadamente). Entonces hazlo:

git rebase -i HEAD~N

los ~N significa rebase el último N commits (N debe ser un número, por ejemplo HEAD~10) Luego, puede editar el archivo que Git le presenta para eliminar la confirmación ofensiva. Al guardar ese archivo, Git reescribirá todos los siguientes commits como si el que borró no existiera.

El libro de Git tiene un buen sección sobre rebase con imágenes y ejemplos.

Tenga cuidado con esto, sin embargo, porque si cambia algo que tener empujado a otro lado, se necesitará otro enfoque a menos que esté planeando hacer un empujón de fuerza.


603
2017-08-27 03:51



Otra posibilidad es uno de mis comandos favoritos personales:

git rebase -i <commit>~1

Esto iniciará la rebase en modo interactivo -i en el punto justo antes del compromiso que quieres golpear. El editor comenzará a enumerar todas las confirmaciones desde entonces. Elimine la línea que contiene la confirmación que desea borrar y guarde el archivo. Rebase hará el resto del trabajo, borrará solo esa confirmación y volverá a incluir todos los demás en el registro.


416
2017-08-27 03:49



Adjuntaré esta respuesta porque no veo por qué alguien que acaba de intentar realizar un trabajo querría eliminar todo ese trabajo debido a algún error al usar Git.

Si desea mantener su trabajo y simplemente 'deshacer' ese comando de compromiso (atrapado antes de presionar para repos):

git reset --soft HEAD~1

No use el --duro marcar a menos que desee destruir su trabajo en progreso desde el último compromiso.


281
2017-10-15 18:17



Si no publicó los cambios, para eliminar la última confirmación, puede hacer

$ git reset --hard HEAD^

(Tenga en cuenta que esto también eliminaría todos los cambios no comprometidos, use con cuidado).

Si ya ha publicado una confirmación para ser eliminado, use git revertir

$ git revert HEAD

47
2017-08-27 10:47



Eliminar un compromiso completo

git rebase -p --onto SHA^ SHA

Obviamente, reemplace "SHA" con la referencia de la que desea deshacerse. El "^" en ese comando es literal.

http://sethrobertson.github.io/GitFixUm/fixup.html


43
2017-08-31 19:36



git reset --hard commitId

git push <origin> <branch> --force

PD: Compromiso se refiere al que desea revertir a


33
2017-10-16 09:51



Si desea reparar su última confirmación, puede deshacer la confirmación y deshacer los archivos en ella haciendo lo siguiente:

git reset HEAD~1

Esto devolverá su repositorio a su estado antes de que el git agregue los comandos que organizaron los archivos. Sus cambios estarán en su directorio de trabajo. HEAD ~ 1 se refiere a la confirmación debajo de la punta actual de la rama.

Si desea confirmar N commits, pero mantenga los cambios de código en su directorio de trabajo:

git reset HEAD~N

Si desea deshacerse de su última confirmación y no desea mantener los cambios en el código, puede hacer un reinicio "difícil".

git reset --hard HEAD~1

Del mismo modo, si desea descartar los últimos N commits, y no desea mantener los cambios de código:

git reset --hard HEAD~N

29
2018-05-31 07:19



Cambia con fuerza el historial

Suponiendo que no solo quiere eliminar la última confirmación, sino que desea eliminar confirmaciones específicas de las últimas n confirmaciones, vaya con:

git rebase -i HEAD~<number of commits to go back>, asi que git rebase -i HEAD~5 si quieres ver los últimos cinco commits.

Luego, en el editor de texto, cambie la palabra pick a drop al lado de cada confirmación que le gustaría eliminar. Guarde y salga del editor. Voila!

Additively Change History

Tratar git revert <commit hash>. Revertir creará un nuevo commit que deshace el commit especificado.


20
2018-06-15 23:01



Digamos que queremos eliminar commits 2 y 4 del repositorio.

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

Nota: Debe tener derechos de administrador sobre el repositorio ya que estás usando --hard y -f.

  • git checkout b3d92c5 Verifica la última confirmación utilizable.
  • git checkout -b repair Crea una nueva rama para trabajar.
  • git cherry-pick 77b9b82 Ejecutar a través de commit 3.
  • git cherry-pick 2c6a45b Ejecutar a través de commit 1.
  • git checkout master Maestro de pago
  • git reset --hard b3d92c5 Restablecer el maestro a la última confirmación utilizable.
  • git merge repair Fusiona nuestra nueva rama en master.
  • git push -f origin master Empuje el maestro al repositorio remoto.

19
2017-09-05 07:19