Quiero descartar todos los cambios realizados después de la confirmación <commit-hash>
. Así que lo hice:
git reset --hard <commit-hash>
Ahora quiero hacer lo mismo con mi control remoto. ¿Cómo puedo hacer esto? He realizado algunos commits (y empujones) después <commit-hash>
y solo quiero descartarlos a todos. Es que algo salió terriblemente mal en el camino y no quiero empeorarlo más de lo que ya está. ; (
Básicamente quiero mi rebobinar origin/master
a<commit-hash>
origin/master
de que otros usuarios no te han tirado y empujado? Cambiar el historial de un repositorio público (es decir, no local) es algo que desea evitar en todo momento.Respuestas:
Suponiendo que su rama se llama
master
tanto aquí como remotamente, y que su control remoto se llamaorigin
, puede hacer lo siguiente:Sin embargo, debe evitar hacer esto si alguien más está trabajando con su repositorio remoto y ha retirado sus cambios. En ese caso, sería mejor revertir las confirmaciones que no desea y luego presionar de manera normal.
Actualización: ha explicado a continuación que otras personas han eliminado los cambios que ha introducido, por lo que es mejor crear una nueva confirmación que revierta todos esos cambios . Hay una buena explicación de sus opciones para hacer esto en esta respuesta de Jakub Narębski . Cuál es más conveniente depende de cuántas confirmaciones desea revertir y qué método tiene más sentido para usted.
Como de su pregunta está claro que ya ha utilizado
git reset --hard
para restablecer sumaster
sucursal, es posible que deba comenzar a usargit reset --hard ORIG_HEAD
para mover su sucursal a donde estaba antes. (Como siempre congit reset --hard
, asegúrese de quegit status
esté limpio, que esté en la rama correcta y que sea consciente de quegit reflog
es una herramienta para recuperar confirmaciones aparentemente perdidas). También debe verificar queORIG_HEAD
apunta a la confirmación correcta, congit show ORIG_HEAD
.Solución de problemas:
Si recibe un mensaje como " ! [Control remoto rechazado] a60f7d85 -> maestro (gancho previo a la recepción rechazado) "
entonces debe permitir la reescritura del historial de sucursal para la sucursal específica. En BitBucket, por ejemplo, decía "No se permite reescribir el historial de sucursales". Hay una casilla de verificación llamada
Allow rewriting branch history
que debe marcar.fuente
git update-ref
lugar dereset --hard
; le permitirá hacer lo mismo sin tener un árbol en funcionamiento / rama desprotegidarevert
pero digamos que quiero revertir los últimos 4 commits, ¿debería hacerlogit revert comit1; git push; git revert comit2; git push; ...
o simplementegit revert commit4; git push
?git revert commit4
crea una nueva confirmación que solo deshace los cambios que se introdujeroncommit4
. Sin embargo, como señala la respuesta a la que he vinculado, puede incluirlos en una sola confirmación.git reset --hard
pero he eliminado mi local y lo saqué del origen nuevamente, así que puedo hacerlo.git revert ...
Mi duda ahora es: ¿tengo que revertir cada confirmación y presionar (una por una) o simplemente revertir la primera confirmación después del derecho cometer solo?.git
directorio con referencias que no querían crear. Sin embargo, me equivoqué al decir que no hay controles de seguridad. Puede encontrar la clasificación en comandos de "plomería" y "porcelana" en la página de manual de git .Use las otras respuestas si no le importa perder los cambios locales. Este método aún puede destruir su control remoto si elige el hash de confirmación incorrecto para volver.
Si solo desea que el control remoto coincida con una confirmación que esté en cualquier parte de su repositorio local:
git log
para encontrar la confirmación que desea que tenga el control remoto.git log -p
para ver cambios ogit log --graph --all --oneline --decorate
para ver un árbol compacto.Ejecute un comando como:
p.ej
o
Utilizo el alias conveniente (
git go
) para ver el historial como en el paso 2, que se puede agregar así:fuente
git config --global alias.graph 'log --graph --all --decorate --oneline'
es menos desordenado y todavía puede limitarlo, por ejemplo:git graph -5
q
para salir del registro git. 2 minutos nunca volveré.less
yq
es la forma normal de salir de él. Git Bash es como un terminal * nix.Resolví problemas como el tuyo con estos comandos:
fuente
En GitLab, es posible que deba configurar su rama como desprotegida antes de hacer esto. Puede hacerlo en [repo]> Configuración> Repositorio> Ramas protegidas. Entonces el método de la respuesta de Mark funciona.
fuente
Si desea una versión anterior del archivo, le recomendaría usar git checkout.
Hacer esto te devolverá en el tiempo, no afecta el estado actual de tu proyecto, puedes ir a mainline git checkout mainline
pero cuando agrega un archivo en el argumento, ese archivo se le devuelve desde una hora anterior a la hora actual de su proyecto, es decir, su proyecto actual se modifica y debe confirmarse.
La ventaja de esto es que no elimina el historial y tampoco revierte los cambios de un código en particular (git revert)
Consulte más aquí https://www.atlassian.com/git/tutorials/undoing-changes#git-checkout
fuente
Mis dos centavos a las respuestas anteriores: si
todavía no funciona, es posible que desee editar
<your-remote-repo>.git/config
la sección de recepción del archivo:fuente
Si su sucursal no es desarrollo o producción, la forma más fácil de lograr esto es restablecer un determinado compromiso localmente y crear una nueva sucursal desde allí. Puedes usar:
git checkout 000000
(donde 000000 es la identificación de confirmación donde desea ir) en su rama problemática y luego simplemente cree una nueva rama:
git remote add [nombre_de_su_remoto]
¡Entonces puedes crear un nuevo PR y todo funcionará bien!
fuente
Haz una cosa, obtén el SHA del commit no. como 87c9808 y luego,
git push --force origin master
fuente
Sourcetree: restablecer el control remoto a una determinada confirmación
Empuje esta confirmación a un nuevo origen / característica / 1337_MyAwesomeFeature
Su rama de características local y su rama de características remotas ahora están en el compromiso anterior (de su elección)
fuente