Pregunta

Me acaba de cometer una fuente equivocada a mi proyecto utilizando la opción --force.

¿Es posible revertir? Entiendo que todas las ramas anteriores han sido sobrescrito con la opción -f, por lo que puede haber metido la pata mis revisiones anteriores.

¿Fue útil?

Solución

Git generalmente no tirar nada, pero se recupera de esto puede todavía ser complicado.

Si usted tiene la fuente correcta, entonces usted podría empujar en el mando a distancia con la opción --force. Git no lo han eliminado las ramas menos que usted le dijo que. Si realmente se ha perdido compromete a continuación, echar un vistazo a esta guía útil para la recuperación compromete . Si conoce el SHA-1 de las confirmaciones que quieres, entonces es probable que estés bien.

Lo mejor que puedes hacer: Volver todo y ver lo que se encuentra todavía en su repositorio local. Hacer lo mismo en el control remoto si es posible. Uso git fsck para ver si se puede recuperar cosas, y sobre todo NO haga funcionar git gc .

Por encima de, sobre todo, nunca utilice la opción --force a menos que realmente, realmente en serio.

Otros consejos

Si conoce el hash cometen, es fácil, simplemente recrear su sucursal.

5794458...b459f069 master -> master (forced update)

Eliminar la rama remota:

git push origin :master

a continuación, volver a crear la rama con los siguientes comandos:

git checkout 5794458
git branch master
git push origin master

La solución ya se menciona aquí

# work on local master
git checkout master

# reset to the previous state of origin/master, as recorded by reflog
git reset --hard origin/master@{1}

# at this point verify that this is indeed the desired commit.
# (if necessary, use git reflog to find the right one, and
# git reset --hard to that one)

# finally, push the master branch (and only the master branch) to the server
git push -f origin master

Si no está en ese repo local, donde el empuje forzado viene, a nivel origin / master no hay manera de recuperar. Pero si usted es suerte GitHub o GitHub de Empresa , se puede echar un vistazo a la REST API y recuperar perdido comprometen como parche, ejemplo:

  1. Agenda de anunciar y encontrar el commit formato largo sha1

https://api.github.com/repos/apache/logging- log4j2 / eventos

  1. Descargar los perdidos comprometerse y recuperar el parche relacionado en los .files trayectoria JSON [] / parche

https://api.github.com/repos/apache/ tala-log4j2 / commit / 889232e28f3863d2a17392c06c1dd8cac68485de

  1. Aplicar localmente y empujar de nuevo

git aplicar patch.patch && git commit -m "restaurado cometer" && git push origin master

Yo hice lo mismo, mientras que deshacer un último empujón para un solo archivo. Terminamos yendo hacia atrás a su estado original del repositorio. Yo estaba usando comandos git desde Linux, 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 pocos más copias de la cesión temporal local):

git add .
git status

(se dice que origin / master se adelantó por 68 las confirmaciones, finos ... esas eran todas las confirmaciones que he eliminado)

git remote set-url origin <GIT_SSH_URL>
git push

Y todo se restauraron la forma en que estaba antes que yo empuje contundente. Lo más importante a recordar es que nunca hacer un git checkout. después de que había empujado con fuerza. Sin embargo, la mejor práctica es la opción de desactivar el empuje. Nunca estoy usando nunca más. Aprendido la lección !!

Otra manera de recuperar los perdidos cometer o incluso para averiguar lo que se perdieron confirmaciones, si el impulso anterior no vino de tu repositorio local, es mirar a su máquina CI.

Si usted tiene un trabajo que pone a prueba la rama principal después de cada confirmación (o una serie de confirmaciones consecutivas), que debe tener, se puede echar un vistazo de lo que estaba probando pasado. Ese es el comprometen necesita restaurar.

La máquina IC siquiera puede mantener un clon local de la cesión temporal, a partir del cual es posible que pueda llevar a cabo esta recuperación.

Fuente: entrega continua: versiones de software confiable a través de generar, probar e implementación de automatización (Addison-Wesley Signature Series (Fowler))

Aquí puede leer decisiones https://evilmartians.com/chronicles/git-push---force-and-how-to-deal-with-it

El segundo me ayudó. Hice mal estos comandos

1) (some-branch) git pull -> correct command was git pull origin some-branch

2) (some-branch) git push -f origin some-branch

Después de estos comandos he perdido tres confirmaciones. Para recuperarlos Miré a la terminal donde hice equivocadamente 'git pull' y he visto que hay una salida como

60223bf ... 0b258eb alguna rama -> origen / alguna rama

El segundo 0b258eb de hash era exactamente lo que necesitaba. Entonces, tomé este comando hash y productos

git push --force origin 0b258eb:some-branch
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top