Me gustaría saber cómo eliminar una confirmación.
Por delete
, quiero decir, es como si no hubiera hecho ese compromiso, y cuando hago un empuje en el futuro, mis cambios no se enviarán a la rama remota.
Leí git help, y creo que el comando que debería usar es git reset --hard HEAD
. ¿Es esto correcto?
git
git-rebase
git-reset
hap497
fuente
fuente
cherry-pick
ydelete
un solo comprometen a que pueden ocurrido hace un tiempo.git rebase -i HEAD~10
responde la pregunta, ya que te permite elegir de forma arbitraria las confirmaciones para eliminar. Git aplica las confirmaciones en el rango que especifique una por una, ignorando las confirmaciones que ha eliminado del registro. Utilicé este comando hoy para deshacerme de la segunda y tercera confirmación más reciente de mi repositorio mientras mantenía la primera. Estoy de acuerdo en que ninguna de las otras respuestas son satisfactorias.Respuestas:
Cuidado:
git reset --hard
ELIMINARÁ SUS CAMBIOS EN EL DIRECTORIO DE TRABAJO . Asegúrese de guardar los cambios locales que desee conservar antes de ejecutar este comando.Suponiendo que esté sentado en ese commit, entonces este comando lo activará ...
El
HEAD~1
significa el compromiso antes de la cabeza.O bien, puede mirar la salida de
git log
, encontrar la identificación de compromiso del compromiso al que desea hacer una copia de seguridad y luego hacer esto:Si ya lo presionó, deberá hacer un esfuerzo forzado para deshacerse de él ...
Sin embargo , si otros pueden haberlo extraído, entonces sería mejor comenzar una nueva rama. Porque cuando tiran, simplemente lo fusionará en su trabajo, y lo volverás a empujar.
Si ya presionó, puede ser mejor usarlo
git revert
para crear una confirmación de "imagen espejo" que deshacerá 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á 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 que "eliminó", normalmente está presente a
git reflog
menos que haya recogido basura en su repositorio.fuente
HEAD~1
o simplementeHEAD^
. Si presionó, debería usargit revert
en su lugar.HEAD~n
para "retroceder" losn
compromisos de su cabeza. Tal vez desde este punto también se pueda interpretar... --hard HEAD
comoHEAD~0
=> eliminar el trabajo en progreso.reset --hard
, y verificalog --oneline --all
, los commits aún permanecen en el árbol. ¿Cómo eliminamos estos commits del árbol? Gracias.reset --soft
para eliminar el compromiso local ¡SIN revertir el trabajo en progreso!Si aún no ha enviado el commit a ninguna parte, puede usarlo
git rebase -i
para eliminar ese commit. Primero, descubra qué tan atrás está esa confirmación (aproximadamente). Entonces hazlo:Los
~N
medios vuelven a redactar las últimasN
confirmaciones (N
debe ser un número, por ejemploHEAD~10
). Luego, puede editar el archivo que Git le presenta para eliminar el commit ofensivo. Al guardar ese archivo, Git reescribirá todas las confirmaciones siguientes como si la que eliminó no existiera.The Git Book tiene una buena sección sobre rebase con imágenes y ejemplos.
Sin embargo, tenga cuidado con esto, porque si cambia algo que ha presionado en otro lugar, se necesitará otro enfoque a menos que esté planeando hacer un impulso forzado.
fuente
push -f
para forzar el empuje y reemplazar la rama remota con la local. Si es solo su propio repositorio remoto, no hay problema. El problema comienza si alguien más ha ido mientras tanto.git rebase -i HEAD~5
comando era exactamente lo que necesitaba para eliminar completamente este commit de mi repositorio local! ¡Gracias!rebase -i
, los cambios correspondientes a la confirmación eliminada no se conservan.Otra posibilidad es uno de mis comandos favoritos personales:
Esto iniciará el rebase en modo interactivo
-i
en el punto justo antes de la confirmación que desea golpear. El editor comenzará a enumerar todas las confirmaciones desde entonces. Elimine la línea que contiene la confirmación que desea eliminar y guarde el archivo. Rebase hará el resto del trabajo, eliminando solo esa confirmación y volviendo a reproducir todos los demás en el registro.fuente
git rebase --continue
git rebase -i HEAD~1
git rebase -i HEAD~1
¡Realmente limpié mucho el repositorio! Es difícil decir exactamente lo que hizo, pero todo parece mucho más ordenado. Un poco alarmante, en realidad.Estoy agregando esta respuesta porque no veo por qué alguien que acaba de intentar comprometerse a trabajar 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 confirmación (capturó antes de presionar para reposicionar):
No use la bandera --hard a menos que quiera destruir su trabajo en progreso desde la última confirmación.
fuente
git reset --hard HEAD~1
su último commit anterior esté disponible a través de reflog (hasta que caduque); ver también aquí: gitready.com/intermediate/2009/02/09/…Eliminar una confirmación completa
Obviamente reemplace "SHA" con la referencia de la que desea deshacerse. La "^" en ese comando es literal.
http://sethrobertson.github.io/GitFixUm/fixup.html#change_deep
fuente
-p, --preserve-merges
Recrea las confirmaciones de fusión en lugar de aplanar el historial mediante la repetición de confirmaciones que introduce una confirmación de fusión. Las resoluciones de conflicto de fusión o las enmiendas manuales para confirmar compromisos no se conservan.Si no publicó los cambios, para eliminar la última confirmación, puede hacer
(tenga en cuenta que esto también eliminaría todos los cambios no confirmados; use con cuidado).
Si ya ha publicado commit para eliminar, use git revert
fuente
tree = log --all --graph --format=format:'%C(bold blue)%h%C(reset) %C(dim black)%s%C(reset)%C(bold red)%d%C(reset) %C(green)by %an, %ar%C(reset)'
Digamos que queremos eliminar los commits 2 y 4 del repositorio.
Nota: debe tener derechos de administrador sobre el repositorio ya que está utilizando
--hard
y-f
.git checkout b3d92c5
Verifique la última confirmación 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
Restablezca el maestro a la última confirmación utilizable.git merge repair
Fusionar nuestra nueva sucursal en master.git push -f origin master
Empuje master al repositorio remoto.fuente
git push -f origin master
no hay opción--hard
commit 0
es mayor quecommit 1
. Por favor, ¿podría decirme por qué primero se ejecutacommit 3
(por selección de cereza) y luego porcommit 1
? Después de pagarb3d92cd
(commit 0
) esperaría una selección de cerezacommit 1
, entoncescommit 3
. Gracias.PD: CommitId se refiere al que desea volver a
fuente
Cambiar con fuerza 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í quegit rebase -i HEAD~5
si quieres ver los últimos cinco commits.Luego, en el editor de texto, cambie la palabra
pick
aldrop
lado de cada confirmación que desee eliminar. Guarde y salga del editor. Voila!Historial de cambios aditivos
Tratar
git revert <commit hash>
. Revertir creará una nueva confirmación que deshace la confirmación especificada.fuente
drop
La palabra clave no está definida. Para eliminar una confirmación, simplemente elimine toda la línea.Si desea arreglar su último commit, puede deshacer el commit y eliminar los archivos en él, haciendo lo siguiente:
Esto devolverá su repositorio a su estado antes de que git agregue 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 liberar N commits, pero mantenga los cambios de código en su directorio de trabajo:
Si desea deshacerse de su último commit y no desea mantener los cambios en el código, puede hacer un restablecimiento "duro".
Del mismo modo, si desea descartar las últimas N confirmaciones y no desea conservar los cambios de código:
fuente
Aquí '2' es el número de confirmaciones que desea rehacer.
si quieres reajustar todos los commits.
Entonces podrá 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 se pueden reordenar; Se ejecutan de arriba a abajo. Si elimina una línea aquí, ESTE COMITÉ SE PERDERÁ. Sin embargo, si elimina todo, se cancelará el rebase. Tenga en cuenta que las confirmaciones vacías se comentan
Simplemente puede eliminar esa confirmación utilizando la opción "d" o Eliminar una línea que tiene su confirmación.
fuente
Para eliminar en la sucursal local, use
Para eliminar en una rama remota, use
fuente
[Respuesta rápida]
Tienes muchas alternativas, por ejemplo:
Alternativa 1:
Alternativa 2:
Alternativa 3:
fuente
Fuente: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8
Eliminar la última confirmación
Por ejemplo, tu último commit
git push origin + aa61ab32 ^: maestro
Ahora desea eliminar esta confirmación, entonces una manera fácil de hacer esto siguiente
Pasos
Primero restablezca la rama al padre de la confirmación actual
Empuje a la fuerza hacia el control remoto.
Para una confirmación particular, desea restablecer está siguiendo
fuente
Aquí hay otra forma de hacer esto:
Verifique la rama que desea revertir, luego restablezca su copia de trabajo local de nuevo a la confirmación de que desea ser la última en el servidor remoto (todo después de que se vaya adiós). Para hacer esto, en SourceTree hice clic derecho en y seleccioné "Restablecer BRANCHNAME a este commit". Creo que la línea de comando es:
Como acaba de retirar su sucursal desde el control remoto, no tendrá cambios locales para preocuparse por perder. Pero esto los perdería si lo hiciera.
Luego navegue al directorio local de su repositorio y ejecute este comando:
Esto borrará todas las confirmaciones después de la actual en su repositorio local, pero solo para esa rama.
fuente
El error:
I
git rebase -i --root
'ed mi rama, pensando ignorantemente pude reformular el primer commit que difiere del maestro (el GitHub para Windows vista predeterminada es la comparación de dominar, ocultando su totalidad).Crecí una barba en Silicon Valley mientras más de 900 compromisos se cargaban en Sublime. Saliendo sin cambios, cargué mi batería y luego procedí a afeitarme, ya que todas las más de 900 confirmaciones individuales rebatieron indiferentemente, restableciendo sus tiempos de confirmación hasta ahora.
Determinado a vencer a Git y preservar los tiempos originales, eliminé este repositorio local y volví a clonarlo desde el control remoto.
Ahora había vuelto a agregar una confirmación de maestro innecesaria más reciente que deseaba eliminar, así que procedí así.
Agotar las opciones:
No quería
git revert
hacerlo, crearía una confirmación adicional, dando a Git la ventaja.git reset --hard HEAD
no hizo nada, después de comprobar elreflog
, el último y únicoHEAD
fue el clon: Git gana.Para obtener el SHA más reciente, revisé el repositorio remoto en github.com: ganancia menor.
Después de pensar que
git reset --hard <SHA>
había funcionado, actualicé otra rama a master y 1 ... 2 ... ¡puf! el compromiso había regresado: Git gana.Regresando al maestro, es hora de intentarlo
git rebase -i <SHA>
, luego elimine la línea ... en vano, es triste decirlo. " Si elimina una línea aquí, ESTE COMITÉ SE PERDERÁ ". Ah ... pasó por alto la nueva función troll n00b en las notas de la versión 2.8.3 .La solución:
git rebase -i <SHA>
entoncesd, drop = remove commit
.Para verificar, verifiqué otra rama y listo, no se esconden, se comprometen a buscar / extraer del maestro.
https://twitter.com/holman/status/706006896273063936
Que tengas un buen día.
fuente
Todos los comandos anteriores restauran el estado de su árbol de trabajo e índice como estaban antes de realizar la confirmación, pero no restauran el estado del repositorio. Si lo miras, el commit "eliminado" no se elimina realmente, simplemente no es el 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 registrar y luego ejecutar a
git prune --expire -now
.fuente
git prune
es en realidad uno de los comandos de "porcelana" . Además, es raro que desee borrar por completo su registro de registro (un caso de uso es eliminar información confidencial de su repositorio, pero como dije, ese es un caso de uso raro). En la mayoría de los casos, querrá mantener las confirmaciones antiguas en el registro de registros, en caso de que necesite recuperar datos. Ver Pro Git: 9.7 Git Internals - Mantenimiento y recuperación de datos .Si desea mantener el historial, mostrando la confirmación y la reversión, debe usar:
ingrese el mensaje explicando por qué revierte y luego:
Cuando emita
git log
, verá los mensajes de confirmación y revertir "incorrectos".fuente
Si acaba de estropear su último commit (mensaje incorrecto, olvidó agregar algunos cambios) y desea corregirlo antes de enviarlo a un repositorio público, ¿por qué no usar:
Si tiene cambios recién organizados, se combinarán con la última confirmación (de la que está tratando de deshacerse) y reemplazarán esa confirmación.
Por supuesto, si modifica una confirmación después de haberla presionado, está reescribiendo el historial, así que si lo hace, asegúrese de comprender las implicaciones.
También puede pasar la opción '--no-edit' en lugar de '-m' si prefiere usar el mensaje de confirmación anterior.
Documentos: http://git-scm.com/docs/git-commit.html
fuente
Si ya presionó, primero encuentre el commit que desea estar en HEAD ($ GIT_COMMIT_HASH_HERE) , luego ejecute lo siguiente:
Luego, en cada lugar donde se ha clonado el repositorio, ejecute:
fuente
Lo que hago generalmente cuando me comprometo y presiono (si alguien presionó su compromiso, esto resuelve el problema):
espero que esto ayude
fuente
Ya he empujado. Necesito devolver algunas confirmaciones de forma remota. He intentado muchas variaciones, pero solo esto de Justin a través de git bush está funcionando bien para mí:
fuente
Restablecer en sucursal local
Forzar el empuje al origen
fuente
Haga una copia de seguridad de su código en la carpeta temporal. El siguiente comando se restablecerá igual que el servidor.
Si desea mantener sus cambios y eliminar confirmaciones recientes
fuente
Referencia: Cómo eliminar un commit en git, local y remoto
fuente
Como puede ver en la imagen de arriba, quiero eliminar la confirmación de revertir "test change 2" (ID SHA1: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 (puede obtener la ID SHA1 usando
gitk
comando en git bash)).Para eso puedo usar (todos los comandos a continuación funcionan solo en local. Debe presionar después de eliminar):
git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2
// te hace una copia de seguridad de ese commit (ID SHA1 del cambio de prueba 4 commit es 515b5220c50e3dfbb1063f23789d92ae1d3481a2 )git reset --hard HEAD~1
// te respalda antes de una confirmación.git reset --hard HEAD^
// Para eliminar el último commit de gitdespués de borrar:
fuente
git reset --hard HEAD~1
Estarás ahora en cabeza anterior. Tira de la rama. Empuje nuevo código. Commit se eliminará de git
fuente
git reset --hard
git push origin HEAD --force
Si una o más de las confirmaciones están etiquetadas, elimine primero las etiquetas. De lo contrario, la confirmación etiquetada no se elimina.
fuente
use git revert https://git-scm.com/docs/git-revert . Revertirá todo el código, entonces puede hacer el próximo commit. Luego, la cabeza señalará ese último commit. las confirmaciones revertidas nunca se eliminan, pero no afectará su última confirmación.
fuente
En mi caso, mi código mágico para este pupose es este:
Pruébalo y dime. He probado algunos diferentes, pero este fue el único que me ayudó.
fuente