Debido a una mala selección de cerezas, mi repositorio Git local está actualmente cinco confirmaciones por delante del origen, y no en un buen estado. Quiero deshacerme de todos estos commits y comenzar de nuevo.
Obviamente, eliminar mi directorio de trabajo y volver a clonar lo haría, pero descargar todo de GitHub nuevamente parece una exageración, y no es un buen uso de mi tiempo.
Tal vez git revert
es lo que necesito, pero no quiero terminar 10 confirmaciones antes del origen (o incluso seis), incluso si el código vuelve al estado correcto. Solo quiero fingir que la última media hora nunca sucedió.
¿Hay un comando simple que haga esto? Parece un caso de uso obvio, pero no encuentro ningún ejemplo de ello.
Tenga en cuenta que esta pregunta es específicamente sobre confirmaciones , no sobre:
- archivos sin seguimiento
- cambios no organizados
- etapas, pero cambios no comprometidos
Respuestas:
Si su exceso de confirmaciones solo es visible para usted, puede hacerlo
git reset --hard origin/<branch_name>
para regresar a donde está el origen. Esto restablecerá el estado del repositorio a la confirmación anterior, y descartará todos los cambios locales.Haciendo una
git revert
hace nuevas confirmaciones para eliminar viejos compromete de una manera que mantiene cuerdo de todos la historia.fuente
git reset --hard <commit hash, branch, or tag>
si desea ir a una referencia específica que no sea una rama remota.master
otra rama, deberías corrergit reset --hard origin/<your-branch-name>
git reset --hard origin/<branch_name>
También restablecerá la configuración del proyecto, así que cuídate de esto. Tengo un.cfg
archivo grande que se restableció a los valores predeterminados. Tuve que pasar horas en eso otra vez.Simplemente elimine su rama maestra local y vuelva a crearla así:
fuente
git reset --hard origin/<branch_name>
Tratar:
para restablecer tu cabeza a donde quieras estar. Usa gitk para ver en qué compromiso quieres estar. También puedes restablecer dentro de gitk.
fuente
Eliminar la confirmación más reciente:
git reset --hard HEAD~1
Elimine la confirmación más reciente, sin destruir el trabajo que ha realizado:
git reset --soft HEAD~1
fuente
Si está utilizando la aplicación Atlassian SourceTree , puede usar la opción de reinicio en el menú contextual.
fuente
En su intento de rama:
Valide la reversión (al estado, sin compromisos locales), usando "
git log
" o "git status
" por lo tanto.fuente
Just to be clear, if you're not working on master but on another branch, you should run git reset --hard origin/<your-branch-name>
git reset --hard @{u}
* elimina todos los cambios locales en la rama actual, incluidas las confirmaciones. Me sorprende que nadie haya publicado esto aún, teniendo en cuenta que no tendrá que buscar qué compromiso volver o jugar con las ramas.* Es decir, restablecer a la rama actual en
@{upstream}
—comúnmenteorigin/<branchname>
, pero no siemprefuente
Para ver / obtener la identificación SHA-1 de la confirmación, también desea volver
Para volver a ese compromiso
!Nota. Todos los commits que se hicieron después de ese commit serán eliminados (y todas sus modificaciones al proyecto). Así que primero clone mejor el proyecto en otra rama o cópielo en otro directorio.
fuente
Tuve una situación en la que quería eliminar una confirmación que no se envió, pero la confirmación fue antes que otra. Para hacerlo, he usado el siguiente comando
git rebase -i HEAD~2
-> rebase las dos últimas confirmacionesY usé 'soltar' para la firma de confirmación que quería eliminar.
fuente
Eliminar archivos no rastreados (cambios locales no confirmados)
Eliminar permanentemente todas las confirmaciones locales y obtener la última confirmación remota
fuente
Para las confirmaciones locales que no se envían, también puede usar
git rebase -i
para eliminar o aplastar una confirmación.fuente
git rebase -i
es una forma más genérica de resolver muchos problemas similares y puede ser útil en una variedad de situaciones.drop
palabra clave (en lugar de eliminar una línea) cuando elimine todas las confirmaciones para evitar que se cancele el rebase.La solución simple será hacer coincidir la HEAD de la rama maestra local con la HEAD de la rama maestra de origen
PD: origen / maestro: es un puntero remoto a la rama maestra. Puede reemplazar el maestro con cualquier nombre de sucursal
fuente
Antes de responder agreguemos algunos antecedentes, explicando qué es esto
HEAD
. ya que algunas de las opciones a continuación resultarán en un cabezal separadoFirst of all what is HEAD?
HEAD
es simplemente una referencia a la confirmación actual (más reciente) en la rama actual.Solo puede haber una sola
HEAD
en un momento dado. (excluyendogit worktree
)El contenido de
HEAD
se almacena dentro.git/HEAD
y contiene los 40 bytes SHA-1 de la confirmación actual.detached HEAD
Si no está en la última confirmación, lo que significa que
HEAD
apunta a una confirmación previa en la historia se llamadetached HEAD
.En la línea de comando, se verá así: SHA-1 en lugar del nombre de la rama ya
HEAD
que no apunta a la punta de la rama actualAlgunas opciones sobre cómo recuperarse de un HEAD separado:
git checkout
Esto verificará que la nueva rama apunte a la confirmación deseada.
Este comando pagará a un commit dado.
En este punto, puede crear una rama y comenzar a trabajar a partir de este punto.
git reflog
Siempre puedes usar el
reflog
también.git reflog
mostrará cualquier cambio que haya actualizadoHEAD
y revisando la entrada de reflog deseada establecerá elHEAD
respaldo de este commit.Cada vez que se modifique el HEAD habrá una nueva entrada en el
reflog
Esto lo llevará de regreso a su compromiso deseado
git reset --hard <commit_id>
"Mueva" su CABEZA de nuevo a la confirmación deseada.
también puedes usar el
git rebase --no-autostash
.git revert <sha-1>
"Deshacer" el compromiso o rango de compromiso dado.
El comando reset "deshacerá" cualquier cambio realizado en el commit dado.
Se confirmará una nueva confirmación con el parche de deshacer, mientras que la confirmación original también permanecerá en el historial.
Este esquema ilustra qué comando hace qué.
Como puede ver allí
reset && checkout
modifique elHEAD
.fuente
Para aquellos interesados en la solución de Visual Studio, aquí está el ejercicio:
Team Explorer
ventana, conéctese al repositorio de destino.Branches
, desde , haga clic derecho en la rama de interés y seleccioneView history
.History
ventana y elijaReset -> Delete changes (--hard)
.Eso descartará sus confirmaciones locales y restablecerá el estado de su repositorio a la confirmación seleccionada. Es decir, sus cambios después de retirar el repositorio se perderán.
fuente
Si su rama está por delante de '
origin/XXX
' por 5 commits.Puedes emitir:
Y debería eliminar los últimos 5 commits.
fuente
Esto será útil si ha cometido algunos errores en su copia local que desea asegurarse de que no se envíen a su sucursal remota por error.
El código SHA se puede obtener mirando la versión web de su panel de control de git para la última confirmación en la rama.
De esta manera, puede sincronizarse con la última confirmación en la rama.
Puede hacerlo
git pull
después de haber completado con éxito el restablecimiento completo para confirmar que no hay nada nuevo para sincronizar, es decir, puede ver el mensaje.Su sucursal está actualizada con
Origin/<Branch Name>
fuente
Si obtiene su repositorio local en un completo desastre, entonces una forma confiable de descartar los compromisos locales en Git es ...
En mi experiencia, Eclipse maneja el mundo que cambia a su alrededor bastante bien. Sin embargo, es posible que deba seleccionar proyectos afectados en Eclipse y limpiarlos para forzar a Eclipse a reconstruirlos. Supongo que otros IDEs también pueden necesitar una reconstrucción forzada.
Un beneficio adicional del procedimiento anterior es que descubrirá si su proyecto se basa en archivos locales que no se pusieron en git. Si encuentra que le faltan archivos, puede copiarlos desde "my_broken_local_repo" y agregarlos a git. Una vez que tenga confianza en que su nuevo repositorio local tiene todo lo que necesita, puede eliminar "my_broken_local_repo".
fuente
Si solo quiere deshacerse de las confirmaciones locales y mantener las modificaciones realizadas en los archivos, haga
git reset @ ~
Otras respuestas abordaron el restablecimiento completo
fuente