todos - revert en git
Eliminar las confirmaciones de una sucursal en Git (27)
Me gustaría saber cómo borrar un commit.
Por delete
, quiero decir que es como si no hubiera hecho ese compromiso, y cuando hago un impulso en el futuro, mis cambios no se enviarán a la rama remota.
Leí git help, y creo que el comando que debo usar es git reset --hard HEAD
. ¿Es esto correcto?
Aquí hay otra manera de hacer esto:
Verifique la sucursal que desea revertir, luego restablezca su copia de trabajo local a la confirmación que desea que sea la última en el servidor remoto (todo lo que sucederá después de que vaya a irse, adiós). Para hacer esto, en SourceTree, hice clic derecho en y seleccioné "Restablecer BRANCHNAME para este compromiso". Creo que la línea de comando es:
git reset --hard COMMIT_ID
Dado que acaba de retirar su sucursal desde el control remoto, no tendrá que realizar cambios locales para preocuparse por perder. Pero esto los perdería si lo hicieras.
Luego navegue al directorio local de su repositorio y ejecute este comando:
git -c diff.mnemonicprefix=false -c core.quotepath=false /
push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME
Esto borrará todas las confirmaciones después de la actual en su repositorio local, pero solo para esa rama.
Digamos que queremos eliminar los commit 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á utilizando --hard
y -f
.
-
git checkout b3d92c5
Checkout el último commit utilizable. -
git checkout -b repair
Crea una nueva sucursal 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
Checkout master. -
git reset --hard b3d92c5
Restablecer maestro a la última confirmación utilizable. -
git merge repair
Combina nuestra nueva sucursal en master. -
git push -f origin master
Empuja el master al repositorio remoto.
El error:
git rebase -i --root
la base de datos de GitHub para Windows , ignorante pensando que podría git rebase -i --root
la primera confirmación diferente del maestro (la vista predeterminada de GitHub para Windows es la comparación con el maestro, ocultando su totalidad).
Crecí una barba de Silicon Valley, mientras que más de 900 compromisos se cargaron en Sublime. Saliendo sin cambios, cargué mi batería y luego procedí a afeitarme, ya que todos los más de 900 comillas individuales se reajustaron despreocupadamente, restableciendo sus tiempos de cometer hasta ahora.
Decidido a vencer a Git y conservar los tiempos originales, eliminé este repositorio local y lo re-cloné desde el control remoto.
Ahora había vuelto a agregar un compromiso innecesario más reciente para el maestro que deseaba eliminar, así que procedí así.
Agotando las opciones:
No quise git revert
: crearía un commit adicional, dándole a Git la ventaja.
git reset --hard HEAD
no hizo nada, después de verificar el reflog
, el último y único HEAD
fue el clon: Git gana.
Para obtener el SHA más reciente, verifiqué el repositorio remoto en github.com - victoria menor.
Después de pensar que git reset --hard <SHA>
había funcionado, actualicé otra rama a master y 1 ... 2 ... poof! El compromiso estaba de vuelta - Git gana.
Comprobando de nuevo al maestro, tiempo para probar git rebase -i <SHA>
, luego elimine la línea ... sin éxito, lamento decirlo. " Si elimina una línea aquí, ese compromiso se perderá ". Ah ... pasado por alto la nueva función, troll el n00b en las notas de la versión 2.8.3 .
La solución:
git rebase -i <SHA>
luego d, drop = remove commit
.
Para verificarlo, verifiqué en otra rama, y listo, sin ocultar el compromiso de obtener / extraer del maestro.
https://twitter.com/holman/status/706006896273063936
Que tengas un buen día.
Fuente: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8
Eliminar la última confirmación
Por ejemplo tu último commit
git push origin + aa61ab32 ^: master
Ahora desea eliminar este compromiso y luego una forma fácil de hacer esto siguiendo
Pasos
Primero restablece la rama al padre de la confirmación actual
Forzarlo hacia el mando a distancia.
git reset HEAD^ --hard git push origin -f
Para el compromiso particular, desea restablecer está siguiendo
git reset bb676878^ --hard
git push origin -f
Lleve la copia de seguridad de su código a la carpeta temporal. El siguiente comando se reiniciará igual que el servidor.
git reset --hard HEAD
git clean -f
git pull
Si desea mantener sus cambios, y eliminar las confirmaciones recientes
git reset --soft HEAD^
git pull
Lo que hago normalmente cuando me comprometo y presiono (si alguien lo presionó, esto resuelve el problema):
git reset --hard HEAD~1
git push -f origin
espero que esto ayude
Me referí a los dos enlaces de abajo, estaría bien.
http://christoph.ruegg.name/blog/git-howto-revert-a-commit-already-pushed-to-a-remote-reposit.html https://gist.github.com/gunjanpatel/18f9e4d1eb609597c50c2118e416e6a6
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 de la confirmación que desea golpear. El editor empezará 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, eliminando solo ese compromiso y reproduciendo todos los demás en el registro.
Para borrar en la rama local, use
git reset --hard HEAD~1
Para borrar en una rama remota, use
git push origin HEAD --force
Restablecer en la sucursal local
git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3
Fuerza de empuje al origen.
git push -f origin
Si aún no ha presionado el compromiso en ninguna parte, puede usar git rebase -i
para eliminar ese compromiso. Primero, averigüe qué tan lejos está ese compromiso (aproximadamente). Entonces hazlo:
git rebase -i HEAD~N
La ~N
significa rebautizar las últimas N
confirmaciones ( N
debe ser un número, por ejemplo HEAD~10
). Luego, puede editar el archivo que Git le presenta para eliminar el compromiso ofensivo. Al guardar ese archivo, Git volverá a escribir todas las siguientes confirmaciones como si la que eliminó no existiera.
El libro de Git tiene una buena sección sobre cómo rebasar con imágenes y ejemplos.
Sin embargo, tenga cuidado con esto, porque si cambia algo que ha empujado en otro lado, se necesitará otro enfoque a menos que esté planeando hacer un empuje de fuerza.
Si acaba de desordenar su último compromiso (mensaje incorrecto, olvidó agregar algunos cambios) y desea corregirlo antes de enviarlo a un repositorio público, ¿por qué no lo usa?
git commit --amend -m "New message here"
Si ha realizado cambios por etapas recientemente, se combinarán con el último compromiso (del que está intentando deshacerse) y reemplazarán ese compromiso.
Por supuesto, si modifica un compromiso después de haberlo empujado, está reescribiendo el historial, por lo que si lo hace, asegúrese de comprender las implicaciones.
También puede pasar la opción ''--no-editar'' en lugar de ''-m'' si prefiere usar el mensaje de confirmación anterior.
Si desea corregir su último compromiso, puede deshacer el compromiso y desempaquetar los archivos que contiene, haciendo lo siguiente:
git reset HEAD~1
Esto devolverá su repositorio a su estado antes de que git agregue comandos que prepararon 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 la confirmación de N, pero mantenga los cambios de código en su directorio de trabajo:
git reset HEAD~N
Si desea deshacerse de su último compromiso y no quiere mantener los cambios de código, puede hacer un restablecimiento "duro".
git reset --hard HEAD~1
Del mismo modo, si desea descartar las últimas N confirmaciones y no desea mantener los cambios de código:
git reset --hard HEAD~N
Si desea mantener el historial, mostrando la confirmación y la reversión, debe utilizar:
git revert GIT_COMMIT_HASH
ingrese el mensaje explicando por qué está revirtiendo y luego:
git push
Cuando emita el git log
, verá tanto la confirmación "incorrecta" como la reversión de los mensajes de registro.
Si no publicaste cambios, para eliminar la última confirmación, puedes hacerlo
$ 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 la confirmación de borrado, use git revert
$ git revert HEAD
Si ya presionó, primero encuentre la confirmación que desea que esté en HEAD ($ GIT_COMMIT_HASH_HERE) , luego ejecute lo siguiente:
git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force
Luego, en cada lugar que se haya clonado el repositorio, ejecute:
git reset --hard origin/master
Suponiendo que no haya enviado al repositorio remoto, podría volver a clonar el repositorio. Este ha sido mi método de elección varias veces.
Todos los comandos anteriores restauran el estado de su árbol de trabajo y el índice como estaban antes de realizar la confirmación, pero no restauran el estado del repositorio. Si lo miras, la confirmación "eliminada" no se elimina realmente, simplemente no es la que está en la punta de la rama actual.
Creo que no hay medios para eliminar un commit con comandos de porcelana . La única forma es eliminarlo del registro y volver a iniciar sesión y luego ejecutar git prune --expire -now
.
git reset - hard
origen git push HEAD --fuerza
Si una o más de las confirmaciones están etiquetadas, elimine la (s) etiqueta (s) primero. De lo contrario, la confirmación etiquetada no se elimina.
use git revert https://git-scm.com/docs/git-revert . Revertirá todo el código y luego podrá hacer el siguiente commit. Luego, la cabeza apuntará al último commit. las confirmaciones revertidas nunca se eliminan, pero no afectarán su última confirmación.
Como se puede ver en la imagen anterior, quiero eliminar la confirmación "cambio de prueba 2" (ID SHA1: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 (puede obtener la ID SHA1 usando el comando gitk
en git bash)).
Para eso puedo usar (todos los comandos de abajo solo funcionan en local. Necesitas presionar después de eliminar):
-
git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2
// lo respalda en ese commit (el ID de SHA1 del commit del cambio de prueba 4 es 515b5220c50e3dfbb1063f23789d92ae1d3481a2 ) -
git reset --hard HEAD~1
// te hace una copia de seguridad antes de una confirmación. -
git reset --hard HEAD^
// Para eliminar la última confirmación de git
después de eliminar:
Cuidado: git reset --hard
SUS CAMBIOS git reset --hard
EL DIRECTORIO DE TRABAJO . Asegúrese de guardar cualquier cambio local que desee mantener antes de ejecutar este comando.
Suponiendo que está sentado en ese compromiso, entonces este comando lo deshará ...
git reset --hard HEAD~1
HEAD~1
significa el commit antes de head.
O bien, puede ver la salida del git log
de git log
, encontrar el ID de confirmación del compromiso al que desea realizar una copia de seguridad y luego hacer esto:
git reset --hard <sha1-commit-id>
Si ya lo presionaste, necesitarás hacer un impulso de fuerza para deshacerte de él ...
git push origin HEAD --force
Sin embargo , si otros lo hubieran retirado, entonces sería mejor comenzar una nueva sucursal. Porque cuando lo jalen, simplemente lo integrará en su trabajo, y lo volverá a subir.
Si ya presionó, puede ser mejor usar git revert
, para crear una confirmación de "imagen reflejada" que deshaga los cambios. Sin embargo, ambas confirmaciones estarán en el registro.
FYI - git reset --hard HEAD
es genial si quieres deshacerte de WORK IN PROGRESS. Lo restablecerá de nuevo a la confirmación más reciente y borrará todos los cambios en su árbol de trabajo e índice.
Por último, si necesita encontrar una confirmación de que "eliminó", normalmente está presente en git reflog
menos que haya recolectado basura en su repositorio.
Eliminando todo un commit
git rebase -p --onto SHA^ SHA
Obviamente, reemplace "SHA" con la referencia de la que desea deshacerse. El "^" en ese comando es literal.
Estoy adjuntando 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 utilizar Git.
Si desea mantener su trabajo y simplemente ''deshacer'' ese comando de confirmación (que detectó antes de presionar para repo):
git reset --soft HEAD~1
No use la marca --hard a menos que quiera destruir su trabajo en progreso desde la última confirmación.
Forzosamente cambiar la historia
Suponiendo que no solo desea eliminar la última confirmación, sino que desea eliminar las confirmaciones específicas de las últimas n confirmaciones, vaya con:
git rebase -i HEAD~<number of commits to go back>
, así que git rebase -i HEAD~5
si quieres ver las últimas cinco confirmaciones.
Luego, en el editor de texto, cambie la pick
palabra para drop
junto a cada confirmación que desee eliminar. Guarde y salga del editor. Voila!
Cambiar adicionalmente la historia
Prueba git revert <commit hash>
. Revert creará una nueva confirmación que deshace la confirmación especificada.
git rebase -i HEAD~2
Aquí ''2'' es el número de confirmaciones que desea reajustar.
''git rebase -i HEAD`
Si quieres rebase todos los commit.
Entonces podrás elegir una de estas opciones.
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
Estas líneas pueden ser reordenadas; Se ejecutan de arriba a abajo. Si eliminas una línea aquí, ese compromiso se perderá. Sin embargo, si eliminas todo, la rebase será abortada. Tenga en cuenta que los comentarios vacíos están comentados
Simplemente puede eliminar ese compromiso con la opción "d" o Eliminar una línea que tenga su compromiso.
git reset --hard commitId
git push <origin> <branch> --force
PD: CommitId se refiere al que desea volver a