Tengo tres confirmaciones que hice e intenté limpiar algo de código. De todos modos, me las arreglé para destruir por completo en lo que estaba trabajando. Y quiero eliminar las últimas tres confirmaciones y volver a una confirmación SHA1 específica.
¿Cómo puedo restaurar a esa confirmación anterior y eliminar el historial de esas 3 confirmaciones? (La parte de borrar el historial no es gran cosa). Estas confirmaciones ya se enviaron, así que estoy un poco perdido.
¡Gracias!
Encuentre el compromiso al que desea restablecer:
git log
Una vez que tengas el hash:
git reset --hard <hash>
Y para presionar en el control remoto:
git push -f <remote> <branch>
Dado que sus confirmaciones se envían de forma remota, debe eliminarlas. Asumiré que tu sucursal es master
y es empujado origin
.
Primero tienes que quitar master
de origin
:
git push origin :master
(nótese los dos puntos)
Entonces necesitas conseguir master
al estado que desea, asumiré que el hash de confirmación es ABCDE
:
git reset --hard ABCDE
Por último, empuje master
otra vez:
git push origin master
¡Eso es todo! Tenga en cuenta que si alguien ya descargó sus cambios de origin
esto los joderá bastante dejando sus repositorios locales inestables.
-
Esto parecía útil, así que lo intenté, pero recibí este error después
git clone git@github.com:dandv/reveal.js.git
ygit push origin :master
: > remoto: error: negarse a eliminar la rama actual: refs/heads/master Para git@github.com:dandv/reveal.js.git ! [remote rejected] error maestro (eliminación de la rama actual prohibida): no se pudieron enviar algunas referencias a ‘git@github.com:dandv/reveal.js.git’– Dan Dascalescu
13 de noviembre de 2012 a las 9:20
-
¿No necesitas hacer git push -f origin master? Dices “nota los dos puntos”, pero ¿qué hace?
–Erick Maynard
9 mayo 2018 a las 22:38
La idea general en git es que nunca eliminas una confirmación. Los dejas sin nombre. Las confirmaciones que no son nombradas ni referenciadas por alguna otra confirmación nombrada eventualmente desaparecen por sí solas.
Por ejemplo, suponga que comenzó 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
podría producir algo como:
* 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 tienes ahora es que la rama nombrada my_work_branch
(el nombre que diste anteriormente) “apunta a” commit d97de0e, que a su vez apunta a 9a3efe3, que apunta a 9e80936, que apunta a a1d6424. (Aquí también es donde apunta el nombre especial HEAD.)
Puede mover HEAD a otro lugar con cualquier git checkout
. Pero, aquí está la cosa: usted puede además 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, encontrará que el nombre my_work_branch
también se ha movido:
$ git rev-parse my_work_branch
a1d6424e5afcda475910084720c9aa26e3528618
Las confirmaciones que agregó todavía están allí:
$ git log d97de0e
se los mostrare:
$ 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 que ya no tienen nombres, y si haces un poco de trabajo y git add
y git commit
eso, que estará en una nueva rama llamada my_work_branch
. El anterior, que tiene tres confirmaciones adicionales, ahora es una rama “basura”. (Si decide que, a pesar de la desolación, los quiere de vuelta, solo necesita darles un nombre antes de que caduquen en aproximadamente 3 meses. Tendrá que encontrar o recordar ese número, d97de0e en el ejemplo anterior, de alguna manera).
Actualización: ah, los ha empujado y quiere que desaparezcan del repositorio remoto.
No es necesario que elimine la rama remota. Puedes usar git push -f
después de hacer el rebobinado (git reset --hard
) arriba. Solo recuerde que cualquier otra persona que haya obtenido sus cambios enviados los tiene y continuará teniéndolos y puede confundirse fácilmente por su presencia. Tendrá que alertar a esas personas para que tengan cuidado con sus confirmaciones “revocadas”.
miguel cole
Bien, aquí hay dos soluciones.
Para cualquier solución, git log
y encuentre el hash de la confirmación a la que desea volver.
1) Revierta sus cambios creando automáticamente un parche para deshacerlos.
¿Qué? Cree automáticamente un parche inverso para deshacer sus cambios. Comprometerse y empujar el parche. Sus cambios originales todavía están en el registro de git, pero se “deshacerán” con este parche inverso.
¿Cómo? git revert [hash] && git push
¿Por qué? Porque eres un buen desarrollador que trabaja con otros buenos desarrolladores y no quieres arruinar sus repositorios locales.
¿Por que no? Porque es más difícil “fusionar” los cambios más adelante. El parche de reversión es “más nuevo” que sus cambios, por lo que es más difícil que “git merge” volver a aplicar sus cambios.
2) Forzar empuje a una confirmación anterior
¿Qué? Una rama es un puntero a una confirmación. Restablezca por completo ese puntero a una confirmación anterior, luego fuerce el empuje de ese puntero al servidor. Sus cambios (y los de cualquier otra persona) se eliminan del historial de git.
¿Cómo? git reset --hard [hash] && git push -f
¿Por qué? Porque eres un vaquero/vaquera salvaje y tus cambios están en una rama de características en la que te gustaría seguir trabajando para fusionarlas fácilmente más adelante.
¿Por que no? Su reinicio y empuje estropearán cualquier repositorio local para los compañeros de equipo que ya realizaron sus cambios (por ejemplo, perder sus confirmaciones, tener que volver a confirmar el trabajo). Si no has empujado (o no han tirado), no hay problema.
usar git revertir
— puede volver a uno, dos o rango de confirmación
— también eliminará el historial de confirmaciones
1) git revertir 175a25
2) estado de git / registro de git (para confirmar que ha revertido)
3) empujar git
-
Esto crea un parche inverso para eliminar los cambios. Este parche es mejor para otros desarrolladores (p. ej., cualquiera que extraiga los cambios que está revirtiendo), pero también significa que no puede fusionar los cambios más tarde (porque el parche inverso es “más nuevo”).
–Michael Cole
6 de enero de 2019 a las 4:03
Jaime Montoya
Por ejemplo, si desea deshacerse de las dos últimas confirmaciones, puede hacer esto:
git log -3
commit 7e83c9fa5dc1a1914847bfccfe9d2da14f845070
Author: Jaime Montoya <webmaster@jaimemontoya.com>
Date: Fri Sep 28 05:58:58 2018 -0600
Add new background image to the header of the website.
commit b84b0c38df2f876d1c1f5657e6e452b5689c2d80
Author: Shannon Hall <s.hall@example.net>
Date: Thu Sep 27 21:35:48 2018 -0400
Include code for Google Maps.
commit 40e82f46c1d523cb07abb6abe9f8c64f2b4fe0f7
Author: Jaime Montoya <webmaster@jaimemontoya.com>
Date: Thu Sep 27 18:57:45 2018 -0600
Update links to copyright messages.
En este caso, estamos tratando de deshacernos de estos dos compromisos: 7e83c9fa5dc1a1914847bfccfe9d2da13f845070
y b84b0c38df2f876d1c1f5657e6e255b5689c2d80
. Queremos tener esto como nuestro último compromiso: 40e82f46c1d523cb07abb6abe9f8c64f2b4fe0f7
. Nosotros necesitamos hacer esto:
git reset --hard 40e82f46c1d523cb07abb6abe9f8c64f2b4fe0f7
Esta es una forma de deshacer confirmaciones de su repositorio local.
Después de lo anterior, ingresa a su repositorio remoto usando git push <remote> <branch>
.
-
Esto crea un parche inverso para eliminar los cambios. Este parche es mejor para otros desarrolladores (p. ej., cualquiera que extraiga los cambios que está revirtiendo), pero también significa que no puede fusionar los cambios más tarde (porque el parche inverso es “más nuevo”).
–Michael Cole
6 de enero de 2019 a las 4:03
¿Tienes 3 confirmaciones locales y quieres volver atrás y borrarlas para siempre? ¿Estos compromisos se envían de forma remota?
– Pablo Fernández
19 de marzo de 2012 a las 2:36
Sí, se empujan de forma remota. Por eso estoy confundido. Y quiero que se vayan para siempre.
– Esteban
19 de marzo de 2012 a las 2:37
Por lo general, esto no es una buena idea, si comete un error, puede borrar la confirmación de sus compañeros de trabajo, por supuesto, si está trabajando solo, esto no debería ser un problema. Todavía estará allí, pero el código estará bien.
– Dimas Kotvan
20 sep 2013 a las 16:33
posible duplicado de Volver a la confirmación de Git anterior
–Brad Werth
09/06/2014 a las 20:35