Cómo devolver un commit deshecho en GitHub

Hice mi proyecto y quise comprometerlo usando GitHub Desktop.

Mientras estaba cometiendo mi primer commit, entendí que no quería que una carpeta estuviera en esa confirmación, así que hice clic en el button Revertir. ¡Entonces encontré el repository de mi proyecto vacío! Traté de devolver mis files haciendo clic en el button "Deshacer la confirmación más reciente".

Así que ahora no tengo ni files ni confirmaciones (no publiqué nada).

Git log y git reflog muestran que no tengo ninguna confirmación.

¿Cómo puedo recuperar mi proyecto?

Lamento una explicación poco clara ya que recién comencé a usar Git.

ejecuta git reflogs : te mostrará el sha1 de los últimos commits en los que git reflogs . Luego solo tiene que verificar el compromiso que le interesa y ponerle una ramificación.

Por ejemplo, supongamos que las primeras líneas de este command son:

 c5e511a HEAD@{0}: checkout: moving from e9c02de51d808c91ac2abbac39166b1daf150452 to origin/master e9c02de HEAD@{1}: checkout: moving from c5e511a7b64da6f52c514f770959e48c3b503169 to e9c02 c5e511a HEAD@{2}: commit: final commit of my project 

y digamos que reconoce que la última línea representa el compromiso que le interesa. Entonces puede ejecutar:

 git checkout c5e511a git checkout -B master 

y voilà: tu twig master está de vuelta a la derecha si pertenece.

Tenga en count que también puede encontrar útil el command

 git show <sha1> 

ya que dará más información sobre un compromiso particular


Por otro lado, si elimina un cambio que no se ha comprometido, entonces se pierde. En ese caso, descanse asegurándose de que sé cómo se siente su dolor … ¡y la buena noticia es que nunca volverá a cometer este error!

revertiste todo y como no se cometió nada antes de que todo desaparezca id guess

Creo que ha perdido todo su trabajo 🙁 y que aprenderá la primera y más importante regla de git:

"primero, comprométase siempre que pueda para save su trabajo y después de hacer lo que quiera (modificar, rebase, fusionar, restablecer, …) ¡siempre podrá deshacer y volver a intentar lo que quiere hacer!"

La segunda regla es tomar 5 minutos para entender el command de reflog para poder encontrar algunas confirmaciones "perdidas" para deshacer fácilmente algunas acciones realizadas siguiendo la primera regla.

Eso es casi todo lo que necesitas para nunca volver a perder un trabajo con git …

Gimiendo

Realmente no soy partidario de estas respuestas que dicen: "No sé cómo solucionarlo, obviamente has perdido todo, ten más cuidado en el futuro"

El hecho de que no sepas cómo hacer algo no significa que debas decir que es imposible. En realidad es un poco inútil porque si las cosas son posibles y simplemente no lo sabe, entonces está diseminando mentiras: P.

Posibles enfoques

De todos modos, casos como este son probablemente idiomáticos, por lo que probablemente no haya un solo command que funcione de manera consistente. Pero puedes probar algunos de los siguientes:

Apoyo

Antes de hacer nada, crea una copy de security del directory repo con cp -r

Descripción general de cómo funciona Git

Ahora, git no debería eliminar ninguna de las confirmaciones hasta que se reúna la basura: algo que creo que debe hacerse manualmente. Esto significa, con suerte, sus compromisos están presentes. Es solo que no eres la reference de tu antiguo master .

Es posible que desee revisar https://git-scm.com/book/en/v2/Git-Internals-Git-Objects para comprender el model de objects git. Un "tl; dr" es que un repository git es un gran tree con pointers. Estos indicadores son references sha.

Puede ser que tengas suerte

El file de git reflog funciona al search en .git/logs , en mi caso, de alguna manera logré eliminar el file .git/logs/refs/heads/master . Sin embargo, el file .git/logs/head aún existía, por lo que pude encontrar una reference a mi twig anterior.

Permitiendo que ejecute git reset --hard COMMIT_FOUND_IN_FILE

El command de plomería git show-ref también refería el sha de mi antigua twig.

O puede que necesite trabajar duro

Incluso en ausencia de estas pistas, es técnicamente posible encontrar hojas de dag de git, una de estas hojas será entonces su twig anterior.

El command git rev-list --objects --all muestra todos los objects en su libre, y git cat-file puede examinar estos objects.

git rev-list --objects --all --graph intentará dibujar algo vagamente gráfico como con sus commits. No estaba muy seguro de cuál era la salida, pero el primer resultado fue mi maestro.