2012-03-19 26 views
23

Tengo tres confirmaciones que hice que intenté limpiar algún código. De todos modos, logré destruir completamente lo que estaba trabajando. Y quiero eliminar las últimas tres confirmaciones y regresar a una confirmación específica SHA1.Git restablecer a la confirmación anterior

¿Cómo puedo restaurar a la confirmación anterior y eliminar el historial de esas 3 confirmaciones? (La parte de borrar historia no es un gran problema). Estas confirmaciones ya se han enviado, por lo que estoy un poco perdido.

Gracias!

+0

Tienes 3 confirmaciones locales y quieres volver atrás y borrarlas para siempre? ¿Estas confirmaciones se envían de forma remota? –

+0

Sí, se presionan de forma remota. Por eso estoy confundido. Y quiero que se hayan ido para siempre. – Steven

+0

es posible, déjame responder –

Respuesta

25

Dado que sus confirmaciones se envían de forma remota, debe eliminarlas. Asumiré que su sucursal es master y la presioné sobre origin.

Primero tiene que quitar master de origin:

git push origin :master (Observe los dos puntos)

Luego hay que llegar a master el estado que desee, voy a suponer la confirmación hash es ABCDE:

git reset --hard ABCDE

Por último, empuje master nuevo:

git push origin master

Eso es todo! Tenga en cuenta que si alguien ya descargó sus cambios de origin, los atornillará dejando sus repositorios locales inestables.

+6

Esto pareció útil, así que lo intenté, pero obtuve este error después de 'git clone [email protected]: dandv/reveal.js.git' y 'origen de git push: master':> remote: error: se niega a eliminar la rama actual: refs/heads/master a [email protected]: dandv/reveal.js.git ! [control remoto rechazado] maestro (eliminación de la rama actual prohibida) error: error al presionar algunas referencias a '[email protected]: dandv/reveal.js.git' –

+0

más útil, gracias: – almaruf

14

La idea general en git es que nunca se elimina una confirmación. Simplemente los dejas sin un nombre. Los commits que no son nombrados ni referenciados por algún otro commit nombrado, finalmente se van por su cuenta.

Por ejemplo, supongamos que se inició con:

$ git checkout my_work_branch 
<do some editing> 
$ git commit -m "attempt #1, so far so good" 
<do more editing> 
$ git commit -m "attempt #2, getting a little hazier" 
<do more editing> 
$ git commit -m "attempt #3, looking bleak now" 

En este punto git log --graph --decorate --pretty=oneline --abbrev-commit puede producir algo así:

* d97de0e (HEAD, my_work_branch) attempt #3, looking bleak now 
* 9a3efe3 attempt #2, getting a little hazier 
* 9e80936 attempt #1, so far so good 
* a1d6424 here's where you started 

Lo que tenemos ahora es que la rama llamada my_work_branch (el nombre que asignó anterior) "apunta a" cometer d97de0e, que a su vez apunta a 9a3efe3, que apunta a 9e80936, que apunta a a1d6424. (Aquí también es donde el nombre especial HEAD señala.)

Puede mover HEAD a otra parte con cualquier git checkout anterior.Sin embargo, aquí está la cosa: se puede también mover el nombre my_work_branch para apuntar a a1d6424 también:

$ git reset --hard a1d6424 

o

$ git reset --hard HEAD~3 # use at most one of these 

Si hace esto, se encuentra que el nombre my_work_branch también ha sido movido:

$ git rev-parse my_work_branch 
a1d6424e5afcda475910084720c9aa26e3528618 

El cometa ha agregado aún están allí:

$ git log d97de0e 

mostrará que a usted:

$ git log --graph --decorate --pretty=oneline --abbrev-commit d79de0e 
* d97de0e attempt #3, looking bleak now 
* 9a3efe3 attempt #2, getting a little hazier 
* 9e80936 attempt #1, so far so good 
* a1d6424 (HEAD, my_work_branch) here's where you started 

Es sólo que ya no tienen ningún nombre, y si lo hace un poco de trabajo y git add y git commit ello, que estará en una nueva rama llamada my_work_branch. El anterior, que tiene los tres compromisos adicionales, ahora es una rama "basura". (Si decide que a pesar de la desolación que desea recuperar, solo necesita darles un nombre antes de que caduque en aproximadamente 3 meses. Deberá encontrar o recordar ese número, d97de0e en el ejemplo anterior, de alguna manera).


Actualizar : ah, los has empujado y quieres que se hayan ido del repositorio remoto.

No tiene que eliminar la rama remota. Puede usar git push -f después de rebobinar (git reset --hard) arriba. Solo recuerde que cualquier otra persona que haya obtenido sus cambios presionados los tiene, y los seguirá teniendo y puede confundirse fácilmente con su presencia. Tendrás que alertar a esas personas para que tengan cuidado con los commits "revocados".

+0

¡Gran explicación! –

40

encontrar el comprometen desea restablecer a:

git log 

Una vez que tenga el hash:

git reset --hard <hash> 

Y para empujar en el mando a distancia:

git push -f <remote> <branch> 
+0

Este es perfecto cuando no has pulsado los commits no deseados en el control remoto. –

0

uso git revert

- puedes revertirá a uno, dos o rango de cometer

- se eliminará la historia también se comprometan

1) git revert 175a25

2) git status/git log (para confirmar que ha revertido)

3) git push

Cuestiones relacionadas