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".
Tienes 3 confirmaciones locales y quieres volver atrás y borrarlas para siempre? ¿Estas confirmaciones se envían de forma remota? –
Sí, se presionan de forma remota. Por eso estoy confundido. Y quiero que se hayan ido para siempre. – Steven
es posible, déjame responder –