Acabo de enviar la fuente incorrecta a mi proyecto usando la --force
opción.
¿Es posible revertir? Entiendo que todas las ramas anteriores se han sobrescrito con la -f
opción, por lo que es posible que haya arruinado mis revisiones anteriores.
git
git-commit
git-push
David van Dugteren
fuente
fuente
Respuestas:
Git generalmente no tira nada, pero recuperarse de esto puede ser complicado.
Si tiene la fuente correcta, puede presionarla en el control remoto con la
--force
opción. Git no habrá eliminado ninguna rama a menos que usted se lo indique. Si realmente ha perdido confirmaciones, eche un vistazo a esta guía útil para recuperar confirmaciones . Si conoce el SHA-1 de las confirmaciones que desea, probablemente esté bien.Lo mejor que puede hacer: haga una copia de seguridad de todo y vea lo que todavía hay en su repositorio local. Haga lo mismo en el control remoto si es posible. Úselo
git fsck
para ver si puede recuperar cosas y, sobre todo, NO ejecutargit gc
.Sobre todo, nunca use la
--force
opción a menos que realmente lo diga en serio.fuente
git reflog show remotes/origin/master
,. Debería poder ver su empuje allí; el compromiso en la línea anterior es donde estaba antes de que lo arruinaras. A continuación, puede enviar esa revisión (con--force
) al origen y volver a donde estaba.git fetch
editado durante mucho tiempo) puedes mostrar el reflog del lado de GitHub y recuperarte!Si conoce el hash de confirmación, es fácil, simplemente vuelva a crear su rama.
Eliminar la rama remota:
luego vuelva a crear su rama con los siguientes comandos:
fuente
La solución ya se menciona aquí.
fuente
git reflog show remotes/origin/master
si es necesario git reflog (como lo menciona @Cascabel arriba)Si no se encuentra en ese repositorio local de donde provino el empuje forzado, a nivel de origen / maestro no hay forma de recuperarse. Pero si tiene la suerte de utilizar GitHub o GitHub para empresas , puede echar un vistazo a la API REST y recuperar la confirmación perdida como parche, por ejemplo:
fuente
Otra forma de recuperar la confirmación perdida o incluso de averiguar qué confirmaciones se perdieron, si la inserción anterior no vino de su repositorio local, es mirar su máquina de CI.
Si tiene un trabajo que prueba la rama maestra después de cada confirmación (o serie de confirmaciones consecutivas), que debería tener, puede echar un vistazo a lo que estaba probando por última vez. Ese es el compromiso que necesita restaurar.
La máquina de CI puede incluso mantener un clon local del repositorio, desde el cual es posible que pueda realizar esta recuperación.
Fuente: probablemente Entrega continua: Versiones de software confiables a través de la automatización de compilación, prueba e implementación (Addison-Wesley Signature Series (Fowler))
fuente
Sí, puedes recuperar confirmaciones después
git push -f your_branch
Entonces puedes hacer:
1-
git reflog
2- elige Head_Number con el que desea recuperarse
git reset –hard HEAD@{HEAD-NUMBER}
3- puedes ver todas las confirmaciones en este encabezado por
git cherry -v branch_name
4- al final debes forzar el empuje
git push -f branch_name
O
1- obtenga el número de SHA de su cliente GIT (interfaz)
2- empuje forzado
Espero que esto ayude
fuente
Hice lo mismo mientras deshacía un último empujón para un solo archivo. Terminé volviendo al estado original del repositorio. Estaba usando comandos git de Linus ya que tenía la copia local en Linux. Por suerte, esa copia seguía intacta.
Todo lo que hice fue (después de hacer frenéticamente algunas copias más del repositorio local):
(decía que origin / master estaba por delante en 68 confirmaciones, bien ... esas fueron todas las confirmaciones que eliminé)
Y todo se restauró tal como estaba antes de que hiciera un fuerte empujón. Lo más importante que debe recordar es no realizar nunca un git checkout. después de haber empujado con fuerza. Pero la mejor práctica es deshabilitar la opción de inserción. Nunca lo volveré a usar. ¡Aprendí mi lección!
fuente
Para las personas en situaciones realmente malas como yo (por ejemplo, si recibe
bad object
errores al ejecutargit reset --hard
):Escribí un script llamado treesaver que extrae todos sus archivos de la API de GitHub como último recurso. Así es como se usa:
treesaver
guión ycd
hazlo.SHA
cadena del árbol que le gustaría restaurar accediendohttps://api.github.com/repos/<your_username_or_org>/<repo>/events
.payload
propiedad correspondiente a su evento push, busque elcommit
que le gustaría volver y haga clic en suurl
.commit.tree
, copie eltree
'surl
.python3 main.py <tree_url> <path_to_save_to>
.Por ejemplo, en mi caso, ejecutaría:
Por supuesto, los RP son bienvenidos.
fuente
Aquí puede leer las decisiones https://evilmartians.com/chronicles/git-push---force-and-how-to-deal-with-it
El segundo me ayudó. Hice mal estos comandos
Después de estos comandos perdí tres confirmaciones. Para recuperarlos miré a la terminal donde hice incorrectamente 'git pull' y vi una salida como
60223bf ... 0b258eb alguna-rama -> origen / alguna-rama
El segundo hash 0b258eb era exactamente lo que necesitaba. Entonces, tomé este hash y produje el comando
fuente