20365 votes

Annule le dernier mouvement

J'ai ajouté accidentellement le mauvais répertoire contenant mes fichiers dans Git. Au lieu d'ajouter un .java le fichier, j'ai ajouté le répertoire contenant l' .class le fichier.

Comment puis-je annuler cette action?

22045voto

Esko Luontola Points 53877

À partir de la documentation pour git-reset:

Annuler un commit et refaire

$ git commit ...              (1)
$ git reset --soft HEAD~1     (2)
$ edit                        (3)
$ git add ....                (4)
$ git commit -c ORIG_HEAD     (5)
  1. C'est ce que vous souhaitez annuler

  2. C'est le plus souvent fait lorsque vous rappeler ce que vous avez commis est incomplète ou que vous avez mal orthographié votre message de commit, ou les deux. Les feuilles de travail de l'arbre tel qu'il était avant "reset". (Les guillemets peut ou peut ne pas être nécessaire dans votre shell)

  3. Faire des corrections de travail de l'arborescence de fichiers.

  4. Des changements de phase pour la validation.

  5. "reset" copie de l'ancien chef de .git/ORIG_HEAD; refaire la commettre, en commençant par son message de journal. Si vous n'avez pas besoin de modifier le message en outre, vous pouvez donner de l'option-C à la place.

10476voto

Kyralessa Points 76456

L'annulation d'un commit est un peu effrayant si vous ne savez pas comment il fonctionne. Mais c'est en fait étonnamment facile si vous comprenez.

Disons que vous avez cela, où C est votre TÊTE et (F) est l'état de vos fichiers.

   (F)
A-B-C
    ↑
  master

Vous souhaitez nuke commettre C et de ne jamais le revoir. Pour ce faire:

git reset --hard HEAD~1

Le résultat est:

 (F)
A-B
  ↑
master

Maintenant B est la TÊTE. Parce que vous avez utilisé --hard, vos fichiers sont remis à leur état à commettre B.

Ah, mais supposons que commettre C n'était pas une catastrophe, mais juste un peu. Vous voulez annuler la validation mais gardez vos modifications pour un peu de montage avant de vous faire une meilleure commettre. En commençant de nouveau à partir d'ici, avec C en tant que votre TÊTE:

   (F)
A-B-C
    ↑
  master

Vous pouvez le faire, laissant le --hard:

git reset HEAD~1

Dans ce cas, le résultat est:

   (F)
A-B-C
  ↑
master

Dans les deux cas, la TÊTE est simplement un pointeur vers le dernier commit. Lorsque vous faites un git reset HEAD~1, vous indiquer à Git pour déplacer le pointeur de TÊTE en arrière d'un commit. Mais (sauf si vous utilisez --hard) vous laissez vos fichiers tels qu'ils étaient. Alors maintenant, git status montre que les changements vous avais vérifié en C. Vous n'avez pas perdu une miette!

Pour le plus léger contact, vous pouvez même annuler votre commit mais laissez vos fichiers et de votre index:

git reset --soft HEAD~1

Ce n'est pas seulement les feuilles de vos fichiers seul, il laisse même votre index seul. Lorsque vous effectuez git status, vous verrez que les mêmes fichiers sont dans l'index comme avant. En fait, après cette commande, vous pourriez faire l' git commit et vous seriez de refaire la même livraison que vous venez d'avoir.

Une chose de plus: Supposons que vous détruisez un commit comme dans le premier exemple, mais en découvrant vous en avez besoin, après tout? Pas de chance, non?

Nope, il y a toujours un moyen de la récupérer. Type git reflog et vous verrez une liste (partielle) s'engager shas que vous avez déplacé. Trouver le commit, vous détruit, et de faire cela:

git checkout -b someNewBranchName shaYouDestroyed

Vous avez maintenant ressuscité qui s'engagent. S'engage à ne pas détruit dans Git pour 90 jours, de sorte que vous pouvez généralement retourner et de sauvetage de l'un de vous ne veut pas dire de se débarrasser de.

2033voto

Andrew Points 30079

Ce qui m'a pris un certain temps à comprendre, alors peut-être que cela va aider quelqu'un...

Il y a deux façons de "défaire" de votre dernier commit, en fonction de si oui ou non vous avez déjà fait votre commit public (poussés à votre dépôt distant):

Comment annuler une validation

Disons que j'ai commis localement, mais maintenant, voulez supprimer ce commit.

git log
    commit 101: bad commit    # latest commit, this would be called 'HEAD'
    commit 100: good commit   # second to last commit, this is the one we want

Pour restaurer tout retour à la façon dont elle était avant le dernier commit, nous devons reset à la livraison avant HEAD:

git reset --soft HEAD^     # use --soft if you want to keep your changes
git reset --hard HEAD^     # use --hard if you don't care about keeping the changes you made

Maintenant, git log montrera que notre dernier commit a été supprimé.

Comment annuler un public de s'engager

Si vous avez déjà fait vos commits public, vous voulez créer un nouveau commit qui va "revenir" les changements que vous faites dans votre précédente livraison (actuel CHEF).

git revert HEAD

Vos modifications seront désormais revenue et prêt à vous engager:

git commit -m 'restoring the file I removed on accident'
git log
    commit 102: restoring the file I removed on accident
    commit 101: removing a file we dont need
    commit 100: adding a file that we need

Pour plus d'infos, découvrez Git Livre - Reset, Checkout et de Revenir

1716voto

bdonlan Points 90068

Ajouter/supprimer les fichiers pour obtenir les choses de la façon dont vous le souhaitez:

git rm classdir
git add sourcedir

Puis modifier le commit:

git commit --amend

La précédente, erronée commit sera modifié pour refléter le nouvel indice de l'état - en d'autres termes, il sera comme vous n'avez jamais fait l'erreur de la première place :)

Notez que vous ne devriez faire cela que si vous n'avez pas poussé encore. Si vous avez poussé, alors vous aurez juste à commettre un corrigé normalement.

985voto

Lennart Koopmann Points 4533
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

ou

git reset --hard HEAD~1

Attention: La commande ci-dessus va supprimer définitivement les modifications apportées à l' .java fichiers (et tous les autres fichiers) que vous avez voulu s'engager.

Le hard reset-à-TÊTE-1 réglez votre copie de travail à l'état de la livraison avant de votre mal commis.

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