Restablecer el control remoto a un cierto compromiso

Quiero descartar todos los cambios realizados después de confirmar <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 hecho algunos commits (y push) después de <commit-hash> y solo quiero descartarlos a todos. Es solo que algo salió terriblemente mal en el path y no quiero empeorarlo de lo que ya está. ; (

Básicamente, quiero rebobinar mi origin/master a <commit-hash>

Suponiendo que su twig se llame master tanto aquí como de forma remota, y que su control remoto se llame origin , podría hacer:

  git reset --hard <commit-hash> git push -f origin master 

Sin embargo, debe evitar hacer esto si alguien más está trabajando con su repository remoto y ha retirado sus cambios. En ese caso, sería mejor revertir las confirmaciones que no desea, y luego presionarlas normalmente.

Actualización: explicó a continuación que otras personas han retirado los cambios que ha realizado, por lo que es mejor crear una nueva confirmación que revierte todos esos cambios. Hay una buena explicación de tus opciones para hacer esto en esta respuesta de Jakub Narębski . Cuál es el más conveniente depende de cuántas confirmaciones desea revertir y qué método tiene más sentido para usted.

Dado que a partir de su pregunta está claro que ya ha utilizado el git reset --hard para restablecer su twig master , puede que necesite comenzar utilizando git reset --hard ORIG_HEAD para git reset --hard ORIG_HEAD a mover su twig a donde estaba antes. (Como siempre, con el git reset --hard , asegúrese de que el git status esté limpio, que esté en la twig derecha y que esté al tanto de git reflog como una herramienta para recuperar confirmaciones aparentemente perdidas). También debe verificar que ORIG_HEAD apunta a la confirmación correcta, con git show ORIG_HEAD .

Resolví un problema como el tuyo mediante estos commands:

 git reset --hard <commit-hash> git push -f <remote> <local branch>:<remote branch> 

Use las otras respuestas si no le importa perder cambios locales. Este método aún puede arruinar su control remoto si elige el hash de confirmación incorrecto para volver a.

Si solo desea que el control remoto coincida con una confirmación que ya se encuentra en su sucursal local:

  1. No hagas ningún reinicio.
  2. Use git log para encontrar el hash de la confirmación en la que desea que esté el control remoto. git log -p para ver los cambios, o git log --graph --all --decorate para ver un tree. (Tener ese último como alias en tu caparazón es muy útil.)
  3. Copia el hash.
  4. Ejecute un command como:

     git push --force <remote> <the-hash>:<the remote branch> 

    p.ej

     git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master 

Mis dos centavos a las respuestas anteriores: si

 git push --force <remote> <the-hash>:<the remote branch> 

todavía no funciona, es posible que desee editar la sección de recepción del file <your-remote-repo>.git/config :

 [receive] #denyNonFastforwards = true denyNonFastforwards = false 

Haga una cosa, obtenga SHA del compromiso no. como 87c9808 y luego,

  1. muévete, esa es tu cabeza a la confirmación especificada (al hacer git reset –hard 89cef43 // menciona tu número aquí)
  2. Luego haga algunos cambios en un file aleatorio, para que el git le pida que lo haga localmente y luego de forma remota. Por lo tanto, lo que necesita hacer ahora es. después de aplicar change git commit -a -m "commit trial"
  3. Ahora presione el siguiente commit (si esto ha sido cometido localmente) por git push origin master
  4. Ahora lo que Git te pedirá es que

error: no se pudieron enviar algunas references a ' https://github.com/YOURREPOSITORY/AndroidExperiments.git ' sugerencia: las actualizaciones se rechazaron porque la sugerencia de su twig actual está detrás de la sugerencia: su contraparte remota. Integre los cambios remotos (por ejemplo, sugerencia: 'git pull …') antes de volver a presionar. **

  1. Por lo tanto, ahora lo que puedes hacer es

git push --force origin master

  1. Y así, espero que funcione 🙂

Si quieres una versión anterior del file, te recomendaría usar git checkout.

 git checkout <commit-hash> 

Hacer esto te enviará de vuelta en el time, no afecta el estado actual de tu proyecto, puedes venir a mainline git checkout mainline

pero cuando agrega un file en el argumento, ese file vuelve a usted desde un momento anterior a su hora actual del proyecto, es decir, su proyecto actual se cambia y debe confirmarse.

 git checkout <commit-hash> -- file_name git add . git commit -m 'file brought from previous time' git push 

La ventaja de esto es que no elimina el historial, y tampoco revierte un código en particular cambia (git revert)

Consulte más aquí https://www.atlassian.com/git/tutorials/undoing-changes#git-checkout