Primero, obtuve "su sucursal está por delante del origen / maestro en 3 confirmaciones", luego mi aplicación ha vuelto a un tiempo anterior con cambios anteriores.
¿Cómo puedo recuperar lo que pasé las últimas 11 horas?
Echa un vistazo a git log HEAD@{1}. Si parece la serie correcta de confirmaciones, entonces puede hacerlo git reset HEAD@{1}.
Ámbar
44
Solo si los códigos están organizados (usando git add), se mantienen en git y se pueden encontrar fácilmente usando comandos como git fsck --lost-found.
Landys
2
Accidentalmente descarté un commit que debería haber mantenido al rebasear. Esto me salvó totalmente de rehacer un par de horas de trabajo.
josephting
27
Esto me salvó la vida.
Lutaaya Huzaifah Idris el
66
Esto salvó mi cordura: D
Frank Fajardo
120
Antes de responder, agreguemos algunos antecedentes, explicando de qué se HEADtrata.
First of all what is HEAD?
HEADes simplemente una referencia a la confirmación actual (más reciente) en la rama actual.
Solo puede haber una sola HEADen un momento dado (excluyendo git worktree).
El contenido de HEADse almacena dentro .git/HEADy contiene los 40 bytes SHA-1 de la confirmación actual.
detached HEAD
Si no está en la última confirmación, lo que significa que HEADapunta a una confirmación previa en el historial se llama detached HEAD.
En la línea de comando, se verá así: SHA-1 en lugar del nombre de la rama ya HEADque no apunta a la punta de la rama actual:
Algunas opciones sobre cómo recuperarse de un HEAD separado:
git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back
Esto verificará la nueva rama que apunta a la confirmación deseada.
Este comando pagará a un commit dado.
En este punto, puede crear una rama y comenzar a trabajar desde este punto en adelante.
# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>
# Create a new branch forked to the given commit
git checkout -b <branch name>
Siempre puedes usar el reflogtambién. git reflog mostrará cualquier cambio que haya actualizado HEADy revisando la entrada de reflog deseada establecerá el HEADrespaldo de este commit.
Cada vez que se modifique el HEAD habrá una nueva entrada en el reflog
git reflog
git checkout HEAD@{...}
Esto lo llevará de regreso a su compromiso deseado
"Mueva" su CABEZA de nuevo a la confirmación deseada.
# This will destroy any local modifications.# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.# You could get merge conflicts if you've modified things which were# changed since the commit you reset to.
Nota: ( desde Git 2.7 ) también puedes usar el git rebase --no-autostash.
"Deshacer" el rango de compromiso o compromiso dado.
El comando reset "deshacerá" cualquier cambio realizado en el commit dado.
Se confirmará una nueva confirmación con el parche de deshacer, mientras que la confirmación original también permanecerá en el historial.
# Add a new commit with the undo of the original one.# The <sha-1> can be any commit(s) or commit range
git revert <sha-1>
Este esquema ilustra qué comando hace qué.
Como puede ver allí, reset && checkoutmodifique el HEAD.
Eso me ahorró muchas horas de trabajo. Usé "git reflog --date = iso" para ver la fecha / hora de cada entrada, ya que no podría asegurarlo sin la marca de tiempo.
MetalMikester
1
para mí, en git reset --hard <commit_id>, eliminar HEADtrabajado! +1 para representación gráfica !!.
reverie_ss
Solo para mencionar: si conoce el nombre de la rama: git reflog <branchname>puede ser bastante útil, ya que ve los cambios de una sola rama.
Markus Schreiber
35
Otra forma de llegar al commit eliminado es con el git fsckcomando.
git fsck --lost-found
Esto generará algo como en la última línea:
dangling commit xyz
Podemos verificar que es el mismo commit usando reflogcomo se sugiere en otras respuestas. Ahora podemos hacer ungit merge
git merge xyz
Nota:
No podemos recuperar la confirmación fscksi ya hemos ejecutado un git gccomando que eliminará la referencia a la confirmación pendiente.
Esta es la única respuesta que funciona si no ha señalado recientemente la confirmación en cuestión, como cuando busca una rama y luego restablece accidentalmente esa rama en otro lugar.
Respuestas:
git reflog
es tu amigo. Busque la confirmación en la que desea estar en esa lista y puede restablecerla (por ejemplo:)git reset --hard e870e41
.(Si no confirmó sus cambios ... podría estar en problemas, ¡comprométase temprano y comprométase a menudo!)
fuente
git log HEAD@{1}
. Si parece la serie correcta de confirmaciones, entonces puede hacerlogit reset HEAD@{1}
.git fsck --lost-found
.Antes de responder, agreguemos algunos antecedentes, explicando de qué se
HEAD
trata.First of all what is HEAD?
HEAD
es simplemente una referencia a la confirmación actual (más reciente) en la rama actual.Solo puede haber una sola
HEAD
en un momento dado (excluyendogit worktree
).El contenido de
HEAD
se almacena dentro.git/HEAD
y contiene los 40 bytes SHA-1 de la confirmación actual.detached HEAD
Si no está en la última confirmación, lo que significa que
HEAD
apunta a una confirmación previa en el historial se llamadetached HEAD
.En la línea de comando, se verá así: SHA-1 en lugar del nombre de la rama ya
HEAD
que no apunta a la punta de la rama actual:Algunas opciones sobre cómo recuperarse de un HEAD separado:
git checkout
Esto verificará la nueva rama que apunta a la confirmación deseada.
Este comando pagará a un commit dado.
En este punto, puede crear una rama y comenzar a trabajar desde este punto en adelante.
git reflog
Siempre puedes usar el
reflog
también.git reflog
mostrará cualquier cambio que haya actualizadoHEAD
y revisando la entrada de reflog deseada establecerá elHEAD
respaldo de este commit.Cada vez que se modifique el HEAD habrá una nueva entrada en el
reflog
Esto lo llevará de regreso a su compromiso deseado
git reset --hard <commit_id>
"Mueva" su CABEZA de nuevo a la confirmación deseada.
git rebase --no-autostash
.git revert <sha-1>
"Deshacer" el rango de compromiso o compromiso dado.
El comando reset "deshacerá" cualquier cambio realizado en el commit dado.
Se confirmará una nueva confirmación con el parche de deshacer, mientras que la confirmación original también permanecerá en el historial.
Este esquema ilustra qué comando hace qué.
Como puede ver allí,
reset && checkout
modifique elHEAD
.fuente
git reset --hard <commit_id>
, eliminarHEAD
trabajado! +1 para representación gráfica !!.git reflog <branchname>
puede ser bastante útil, ya que ve los cambios de una sola rama.Otra forma de llegar al commit eliminado es con el
git fsck
comando.Esto generará algo como en la última línea:
Podemos verificar que es el mismo commit usando
reflog
como se sugiere en otras respuestas. Ahora podemos hacer ungit merge
Nota:
No podemos recuperar la confirmación
fsck
si ya hemos ejecutado ungit gc
comando que eliminará la referencia a la confirmación pendiente.fuente