1102 votes

L'annulation d'un git reset --hard HEAD~1

Est-il possible d'annuler les modifications causées par le texte suivant:

git reset --hard HEAD~1

1665voto

Brian Riehman Points 7510

Pat Notz est correct. Vous pouvez obtenir la validation de retour si longtemps que ça a été dans un délai de quelques jours. git ne collecte des ordures après environ un mois, sauf si vous explicitement dire à supprimer le plus récent des gouttes.

$ git init
Initialized empty Git repository in .git/

$ echo "testing reset" > file1
$ git add file1
$ git commit -m 'added file1'
Created initial commit 1a75c1d: added file1
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 file1

$ echo "added new file" > file2
$ git add file2
$ git commit -m 'added file2'
Created commit f6e5064: added file2
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 file2

$ git reset --hard HEAD^
HEAD is now at 1a75c1d... added file1

$ cat file2
cat: file2: No such file or directory

$ git reflog
1a75c1d... HEAD@{0}: reset --hard HEAD^: updating HEAD
f6e5064... HEAD@{1}: commit: added file2

$ git reset --hard f6e5064
HEAD is now at f6e5064... added file2

$ cat file2
added new file

Vous pouvez le voir dans l'exemple que le fichier2 été enlevé par la suite de le hard reset, mais a été remis en place quand je reset via le reflog.

356voto

Pat Notz Points 46841

Ce que vous voulez faire est de spécifier le sha1 de la validation que vous souhaitez restaurer. Vous pouvez obtenir le sha1 par l'examen de la reflog (git reflog) et puis en faisant

git reset --hard <sha1 of desired commit>

Mais n'attendez pas trop longtemps... après quelques semaines git verrez par la suite que s'engager comme non référencées et supprimer toutes les gouttes.

166voto

markmc Points 698

La réponse est cachée dans la réponse détaillée ci-dessus, vous pouvez tout simplement faire:

$> git reset --hard HEAD@{1}

(Voir la sortie de git reflog spectacle)

105voto

sverrejoh Points 4174

Il est possible de le récupérer si Git n'a pas d'ordures collectées encore.

Obtenez un aperçu des balançant s'engage avec fsck:

$ git fsck --lost-found
dangling commit b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf

Récupérer le balançant commit avec git rebase:

$ git rebase b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf

21voto

Jörg W Mittag Points 153275

Si vous n'avez pas encore d'ordures collectées à partir de votre référentiel (par exemple à l'aide de git repack -d ou git gc, mais note que la collecte des ordures peut aussi se faire automatiquement), puis votre livraison est toujours là, seulement, n'est plus accessible par la TÊTE.

Vous pouvez essayer de trouver votre s'engager en regardant à travers la sortie de l' git fsck --lost-found.

Les nouvelles versions de Git quelque chose appelé le "reflog", qui est un journal de toutes les modifications apportées à la refs (par opposition à des modifications qui sont apportées au contenu du référentiel). Ainsi, par exemple, chaque fois que vous allumez votre TÊTE (c'est à dire chaque fois que vous faites un git checkout pour passer branches) qui sera enregistré. Et, bien sûr, votre git reset également manipulé la TÊTE, il a également été enregistré. Vous pouvez accéder à d'anciens membres de votre refs de la même manière que vous pouvez accéder à d'anciens membres de votre dépôt, à l'aide d'un @ signer à la place d'un ~, comme git reset HEAD@{1}.

Il m'a fallu un moment pour comprendre ce qu'est la différence entre la TÊTE de@{1} et la TÊTE~1, donc voici une petite explication:

git init
git commit --allow-empty -mOne
git commit --allow-empty -mTwo
git checkout -b anotherbranch
git commit --allow-empty -mThree
git checkout master # This changes the HEAD, but not the repository contents
git show HEAD~1 # => One
git show HEAD@{1} # => Three
git reflog

Donc, HEAD~1 signifie "aller à la livraison avant la validation que la TÊTE actuellement des points", tandis que d' HEAD@{1} signifie "aller à l'engager à TÊTE pointue à l'avant elle a fait à l'endroit où il des points".

Qui vous permettra facilement de trouver votre perte de s'engager et de le récupérer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X