2009-08-13 25 views
435

Aquí es lo que hice en mi supuesta-a-ser-estable rama ...'git push'

% git rebase master 
First, rewinding head to replay your work on top of it... 
Fast-forwarded alpha-0.3.0 to master. 
% git status 
# On branch alpha-0.3.0 
# Your branch is ahead of 'origin/alpha-0.3.0' by 53 commits. 
# 
nothing to commit (working directory clean) 
% git push 
Fetching remote heads... 
    refs/ 
    refs/heads/ 
    refs/tags/ 
    refs/remotes/ 
'refs/heads/master': up-to-date 
updating 'refs/heads/alpha-0.3.0' 
    from cc4b63bebb6e6dd04407f8788938244b78c50285 
    to 83c9191dea88d146400853af5eb7555f252001b0 
    done 
'refs/heads/unstable': up-to-date 
Updating remote server info 

Eso fue un error, ya que más tarde di cuenta. Me gustaría deshacer todo este proceso y revertir la rama alpha-0.3.0 a lo que era.

¿Qué debo hacer?

+0

este Stack stackoverflow tal vez? http://stackoverflow.com/questions/134882/undoing-a-git-rebase – Steen

+4

No es realmente la misma situación, deshacer una rebase es un escenario de repositorio local, deshacer un git push implica un repositorio remoto y puede ser más complicado según el acceso que tenga. –

+0

Steen - Tienes razón - probablemente debería haber supongo. Me imaginé que la bendita repositorio que todos tiramos de más de una tarea de administración y por lo tanto pertenece aquí, donde git del lado del cliente en general es una cuestión stackoverflow. – Cyrus

Respuesta

697

Debe asegurarse de que ningún otro usuario de este repositorio busque los cambios incorrectos ni intente construir sobre los commit que desea eliminar porque está a punto de rebobinar el historial.

Luego debe forzar la inserción de la referencia anterior.

git push -f origin last_known_good_commit:branch_name 

o en su caso

git push -f origin cc4b63bebb6:alpha-0.3.0 

Es posible que tenga receive.denyNonFastForwards conjunto en el repositorio remoto. Si este es el caso, recibirá un error que incluye la frase [remote rejected].

En este caso, deberá eliminar y volver a crear la rama.

git push origin :alpha-0.3.0 
git push origin cc4b63bebb6:refs/heads/alpha-0.3.0 

Si esto no funciona - tal vez porque tiene receive.denyDeletes set, entonces usted tiene que tener acceso directo al depósito. En el repositorio remoto, debe hacer algo como el siguiente comando de fontanería.

git update-ref refs/heads/alpha-0.3.0 cc4b63bebb6 83c9191dea8 
+12

Una respuesta perfecta y bien explicado - muchas gracias. Para cualquier persona que tropiece con esto, por razones académicas probé los dos primeros enfoques, y ambos funcionaron; obviamente, si el primero funciona, es el enfoque más limpio. Si tuviera que elevarte 10 veces Charles, lo haría. :) – Cyrus

+133

Para una referencia rápida, la primera línea aquí es 'git push -f origen last_known_good_commit: branch_name' – philfreo

+5

git push -f origen cc4b63bebb6: alpha-0.3.0 => este me ayudó, Note alpha-0.3.0 es el nombre de la sucursal y cc4b63bebb6 es la identificación de confirmación a la que deseamos volver. entonces, después de llevar a cabo este comando estaremos en cc4b63bebb6 commit id. – kumar

120

creo que también se puede hacer esto:

git checkout alpha-0.3.0 
git reset --hard cc4b63bebb6 
git push origin +alpha-0.3.0 

Esto es muy similar a la del último método, excepto que no tiene que ensuciar alrededor en el repositorio remoto.

+8

Esto también funcionó para mí, pero vale la pena señalar que esto "volverá a escribir" la historia en el control remoto. Esto puede ser lo que quieras, ¡pero puede que no sea así! – Tom

+1

+1 por esta respuesta que realmente me ayudó. También quería agregar (y dejar las cosas claras) que la ID de confirmación (que viene después del parámetro "' --hard' ") debería ser la ID de la confirmación a la que desee restablecer su bifurcación. –

+0

¿cómo es que cuando lo haga 'pull' git, me sale algo como:' maestro fe88549..50a8083 -> origin/master Ya hasta al date.' – Michelle

31

La solución aceptada (de @charles bailey) es muy peligrosa si está trabajando en un repositorio compartido.

Como práctica recomendada, todas las confirmaciones enviadas a un repositorio remoto que se comparte deben considerarse 'inmutables'. Uso 'git revert' en su lugar: http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#fixing-mistakes

https://git-scm.com/book/be/v2/Git-Basics-Undoing-Things

+0

¿Cuáles son exactamente las instrucciones que está prescribiendo? Parece que solo tienes enlaces antiguos. – jww

14

Otra manera de hacer esto:

  1. crear otra rama
  2. la caja de la confirmación anterior de esa rama usando "git checkout"
  3. empujar la nueva rama.
  4. elimine el antiguo brazo & empujar el borrado (uso git push origin --delete <branch_name>)
  5. cambiar el nombre de la nueva rama en la rama de edad
  6. empuje de nuevo.
+2

Esta parece una solución real cuando ya ha cometido errores en el repos –

24

Una manera de hacerlo sin perder los cambios que quería:

git reset cc4b63b 
git stash 
git push -f origin alpha-0.3.0 
git stash pop 

continuación, puede elegir los archivos que significaba para empujar

68

git revert es menos peligroso que algunos de los enfoques sugeridos aquí :

prompt> git revert 35f6af6f77f116ef922e3d75bc80a4a466f92650 
[master 71738a9] Revert "Issue #482 - Fixed bug." 
4 files changed, 30 insertions(+), 42 deletions(-) 
prompt> git status 
# On branch master 
# Your branch is ahead of 'origin/master' by 1 commit. 
# 
nothing to commit (working directory clean) 
prompt> 

Reemplazar 35f6af6f77f116ef922e3d75bc80a4a466f92650 con su propia confirmación.

+2

¿Cómo puedo obtener la ID 35f6af6f77f116ef922e3d75bc80a4a466f92650? Esta respuesta sería mejor si pudieras explicar eso. – Volomike

+1

@Volomike (y Googling desarrolladores del futuro), esta cuestión se describen muchas maneras de conseguirlo: [control de versiones y la pregunta de hash de SO] (http://stackoverflow.com/questions/949314/how-to-retrieve-the -hash-para-el-presente-entrega-en-GIT) – Jaime

+0

Esta es la respuesta correcta, ya que con "git reset" que no debería ser capaz de empujar (Actualizaciones fueron rechazadas debido a que la punta de la rama actual está detrás de su control remoto contraparte) o necesita forzar el tirón que no está realmente limpio. –

5
git push origin +7f6d03:master 

Esto volverá a su cesión temporal mencionado cometer número

+0

Esta es la respuesta más directa. Eres un protector de vida. –

6

múltiples deshacer compromete git reset 0ad5a7a6 --hard (sólo proporcionan comprometerse de hash SHA1)

Deshacer última confirmación de reinicio

git CABEZA --hard ~ 1 (cambios de última confirmación serán eliminados) git reset --soft CABEZA ~ 1 (cambios de última confirmación estará disponible como modificaciones locales uncommited)

-1

Esto eliminará el último empujado cometen en la rama remota (maestría o su sucursal):

git push origin +HEAD^:master  
+0

¡sí! esto funcionó como un encanto cuando se trabaja con github. Gracias. – cukabeka

+0

¡No! Esto hizo algo super raro que no deshizo los cambios. –

+1

esto acaba de eliminar mis archivos locales, que se utilizaron en la confirmación anterior. es probable que no haya advertido sobre la retirada de una sucursal remota antes de esto. No sé cómo resolver el problema en este momento. – WebComer

1

Escenario 1: Si desea deshacer la última confirmación decir 8123b7e04b3, a continuación es el comando (esto funcionó para mí):

git push origin +8123b7e04b3^:master 

salida se parece a continuación:

Total 0 (delta 0), reused 0 (delta 0) 
To https://testlocation/code.git 
+ 8123b7e...92bc500 8123b7e04b3^ -> master (forced update) 

Otros detalles: Escenario 2: En algunas situaciones, es posible que desee invertir de nuevo lo que acaba de undo'ed (básicamente deshacer lo deshecho) a través de la orden anterior, a continuación, utilizar el comando a continuación:

git reset --hard 8123b7e04b3 

salida:

HEAD is now at cc6206c Comment_that_was_entered_for_commit 

Más información aquí: https://github.com/blog/2019-how-to-undo-almost-anything-with-git