He leído publicaciones similares sobre este tema, y no puedo entender cómo hacerlo correctamente.
Registré alrededor de 1000 archivos que no quiero, y prefiero no tener que pasar por 1by1 y eliminarlos todos del repositorio.
- Tengo una
master
sucursal remota . - Tengo la
master
sucursal local .
Ambos están en la misma revisión.
Quiero revertir mi control remoto en 1 commit.
Digamos que mi historia master
es A--B--C--D--E
.
Quiero revertir mi local a D
.
Luego empújelo a remoto para que mi hash actual sea D remoto y local.
Tengo problemas para hacer esto.
Estoy usando Git Tower pero me siento cómodo con la línea de comando. ¿Alguna ayuda?
ACTUALIZACIÓN: Grandes comentarios a continuación. El uso de un reinicio parece estar parcialmente desaconsejado, especialmente si el repositorio se comparte con otros usuarios. ¿Cuál es la mejor manera de deshacer los cambios del commit anterior sin usar un restablecimiento completo ? ¿Hay alguna manera?
git revert
para hacer sin restablecimientos duros y sin molestar a los usuarios.Respuestas:
Si nadie ha retirado su repositorio remoto todavía, puede cambiar el HEAD de su rama y forzarlo a dicho repositorio remoto:
(o, si tiene acceso directo al repositorio remoto, puede cambiar su referencia HEAD aunque sea un repositorio simple )
Tenga en cuenta que, como comenta la tecnología alienígena en los comentarios a continuación , en Windows (sesión CMD), necesitaría
^^
:Actualización desde 2011:
Usar
git push --force-with-lease
( que presento aquí , presentado en 2013 con Git 1.8.5) es más seguro.Vea la respuesta de Schwern como ilustración.
Entonces sugeriría algo que no reescribe la historia:
git revert
localmente su último commit (creando un nuevo commit que revierte lo que hizo el commit anterior)git revert
.fuente
reset --hard HEAD^
y noreset --hard HEAD^^
restablecer el último commit.Establezca la rama local una revisión hacia atrás (
HEAD^
significa una revisión hacia atrás):Empuje los cambios al origen:
Tendrás que forzar a empujar porque de lo contrario git reconocería que estás detrás
origin
por un compromiso y nada cambiará.Al hacerlo,
--force
le dice a git que sobrescribaHEAD
en el repositorio remoto sin respetar ningún avance allí.fuente
git push origin master
, Git puede crear una nueva confirmación en el control remoto porque la rama local está adelante al menos una vez? Además, este último debe ser sustancialmente diferente de lo que apunta la cabeza en el repositorio remoto.Si desea revertir la última confirmación, escuche:
Paso 1:
Verifique sus confirmaciones locales con mensajes
Paso 2:
Elimine la última confirmación sin restablecer los cambios desde la rama local (o maestra)
O si no desea escuchar los últimos archivos de confirmación y actualizaciones
Paso 3:
Podemos actualizar los archivos y códigos y nuevamente necesitamos presionar con fuerza para que elimine el commit anterior. Mantendrá un nuevo compromiso.
¡Eso es!
fuente
Al ingresar el siguiente comando, puede ver su historial de confirmación de git:
$ git log
Digamos que su historial en esa rama en particular es como: commit_A, commit_B, commit_C, commit_D. Donde, commit_D es el último commit y aquí es donde queda HEAD. Ahora, para eliminar su último commit de local y remoto, debe hacer lo siguiente:
Paso 1: eliminar el último compromiso localmente mediante:
$ git reset --DUR HEAD ~
Esto cambiará su commit HEAD a commit_C
Paso 2: Empuje su cambio para el nuevo HEAD commit to remote
$ git push origin + HEAD
Este comando eliminará la última confirmación del control remoto.
PD: este comando se prueba en Mac OSX y también debería funcionar en otros sistemas operativos (sin embargo, no reclama sobre otros sistemas operativos)
fuente
Para máquinas con Windows, use:
fuente
Aquí hay una versión actualizada del procedimiento que es más segura.
git push -f
reemplazará indiscriminadamente el repositorio remoto con sus propios cambios. Si alguien más ha presionado los cambios, se perderán.git push --force-with-lease
solo empujará su rebase si el repositorio es como espera. Si alguien más ya ha presionado, su impulso fallará.Ver –fuerza considerada dañina; entendiendo git's –force-with-lease .
Recomiendo alias esto como
repush = push --force-with-lease
.Diles que lo hagan
git pull --rebase=merges
. En lugar de agit fetch origin
ygit merge origin/master
lo harágit fetch origin
ygit rebase -r origin/master
. Esto reescribirá cualquiera de sus cambios localesmaster
en la parte superior del nuevo rebaseorigin/master
.-r
preservará cualquier fusión que puedan haber hecho.Recomiendo que este sea el comportamiento predeterminado para tirar. Es seguro, manejará los rebases de otros y resulta en fusiones menos innecesarias.
fuente
--force-with-lease
opción.Resolví problemas como el tuyo con estos comandos:
fuente
Si tiene acceso directo al repositorio remoto, siempre puede usar:
Esto funciona ya que no hay ningún intento de modificar el directorio de trabajo inexistente. Para más detalles, consulte la respuesta original:
¿Cómo puedo confirmar la última confirmación en un repositorio de git bare?
fuente
Solo quería eliminar el último commit del historial de commit remoto y claro también. Lo siguiente funcionó a las mil maravillas
fuente
La forma de restablecer la cabeza y revertir la confirmación anterior es a través de
Pero a veces puede no ser aceptado en la rama remota:
entonces la otra forma de hacerlo es
Esto funciona bien
NOTA: recuerde si
git push -f <force>
falló y luego intenta revertir. Haga ungit pull
antes, de modo que lo remoto y lo local estén sincronizados y luego intentegit revert
.Verifique
git log
para asegurarse de que el control remoto y el local estén en el mismo punto de confirmación con el mismo SHA1.fuente
en maestro local
No hay que preocuparse si otro ha tirado o no.
¡Hecho!
fuente
Si solo desea eliminar la última confirmación del repositorio remoto sin desordenar su repositorio local, aquí hay una línea:
Utiliza la siguiente sintaxis:
Aquí,
<remote>
esorigin
y<refspec>
tiene la siguiente estructura:Los detalles se pueden encontrar en
git-push(1)
. Lo anterior+
significa "forzar a empujar esta referencia", y la otra parte significa "deorigin/master~
amaster
(de remotoorigin
)". No es difícil saber queorigin/master~
es el último commit antesorigin/master
, ¿verdad?fuente
para mí funciona estos dos comandos:
fuente
También puedes hacer esto:
y que todos los demás que obtuvieron los últimos commits malos se restablezcan:
fuente