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/mastera<commit-hash>

origin/masterde 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
mastertanto 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 --hardpara restablecer sumastersucursal, es posible que deba comenzar a usargit reset --hard ORIG_HEADpara mover su sucursal a donde estaba antes. (Como siempre congit reset --hard, asegúrese de quegit statusesté limpio, que esté en la rama correcta y que sea consciente de quegit refloges una herramienta para recuperar confirmaciones aparentemente perdidas). También debe verificar queORIG_HEADapunta 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 historyque debe marcar.fuente
git update-reflugar dereset --hard; le permitirá hacer lo mismo sin tener un árbol en funcionamiento / rama desprotegidarevertpero 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 commit4crea 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 --hardpero 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?.gitdirectorio 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 logpara encontrar la confirmación que desea que tenga el control remoto.git log -ppara ver cambios ogit log --graph --all --oneline --decoratepara 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 -5qpara salir del registro git. 2 minutos nunca volveré.lessyqes 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/configla 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 masterfuente
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