Question Comment annuler les plus récents commit dans Git?


J'ai accidentellement commis de mauvais fichiers à Git, mais je n'ai pas encore poussé le commit sur le serveur.

Comment puis-je annuler ces validations à partir du référentiel local?


17794
2017-07-28 22:22


origine


Réponses:


Annuler un commit et refaire

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
<< edit files as necessary >>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. C'est ce que vous voulez annuler
  2. Cela laisse votre arbre de travail (l'état de vos fichiers sur le disque) inchangé, mais annule le commit et laisse les changements que vous avez commis non-stocke (ainsi ils apparaîtront comme "Changements non mis en scène pour la validation" dans git statuset vous devrez les ajouter à nouveau avant de vous engager). Si vous seulement vouloir ajouter plus de modifications à la validation précédente ou modifiez le message de validation1, tu pourrais utiliser git reset --soft HEAD~ au lieu de cela, qui est comme git reset HEAD~ (où HEAD~ est le même que HEAD~1) mais laisse vos changements existants mis en scène.
  3. Apportez des corrections aux fichiers de l'arborescence de travail.
  4. git add tout ce que vous voulez inclure dans votre nouveau commit.
  5. Validez les modifications en réutilisant l'ancien message de validation. reset copié la vieille tête à .git/ORIG_HEAD; commit avec -c ORIG_HEAD ouvrira un éditeur, qui contient initialement le message du journal de l'ancienne validation et vous permet de le modifier. Si vous n'avez pas besoin de modifier le message, vous pouvez utiliser le -C option.

Attention cependant si vous avez ajouté de nouvelles modifications à l'index, en utilisant commit --amend les ajoutera à votre commit précédent.

Si le code est déjà envoyé à votre serveur et que vous avez l'autorisation d'écraser l'historique (rebase), alors:

git push origin master --force

Vous pouvez également regarder cette réponse:

Comment déplacer la tête vers un emplacement précédent? (Tête détachée)

La réponse ci-dessus va vous montrer git reflog qui est utilisé pour savoir quel est le SHA-1 auquel vous souhaitez revenir. Une fois que vous avez trouvé le point auquel vous souhaitez annuler pour utiliser la séquence de commandes comme expliqué ci-dessus.


1 Notez, cependant, que vous n'avez pas besoin de réinitialiser un commit précédent si vous venez de faire une erreur dans votre message de validation. L'option la plus facile est de git reset (pour surpasser tous les changements que vous avez faits depuis), puis git commit --amend, qui ouvrira votre éditeur de message de validation par défaut pré-rempli avec le dernier message de validation.


19231
2018-06-16 17:27



Annuler un commit est un peu effrayant si vous ne savez pas comment cela fonctionne. Mais c'est vraiment incroyablement facile si vous comprenez.

Dites que vous avez ceci, où C est votre HEAD et (F) est l'état de vos fichiers.

   (F)
A-B-C
    ↑
  master

Tu veux nuke commettre C et ne jamais le revoir. Tu fais cela:

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 réinitialisés à leur état à la validation B.

Ah, mais supposons que le commit C n'était pas un désastre, mais juste un peu off. Tu veux annuler la validation mais conserver vos modifications pour un peu d'édition avant de faire un meilleur commit. Repartir d'ici, avec C comme votre HEAD:

   (F)
A-B-C
    ↑
  master

Vous pouvez le faire, en laissant le --hard:

git reset HEAD~1

Dans ce cas, le résultat est:

   (F)
A-B-C
  ↑
master

Dans les deux cas, HEAD est juste un pointeur sur le dernier commit. Quand tu fais un git reset HEAD~1, vous dites à Git de déplacer le pointeur HEAD d'un commit. Mais (sauf si vous utilisez --hard) vous laissez vos fichiers comme ils étaient. Alors maintenant git status montre les changements que vous avez vérifié dans C. Vous n'avez rien perdu!

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

git reset --soft HEAD~1

Cela ne laisse pas seulement vos fichiers, il laisse même votre indice seul. Quand tu fais git status, vous verrez que les mêmes fichiers sont dans l'index comme avant. En fait, juste après cette commande, vous pourriez faire git commit et vous referiez le même engagement que vous venez de faire.

Encore une chose: Supposons que vous détruisiez un commit comme dans le premier exemple, mais alors découvrez que vous en aviez besoin après tout? Tough luck, non?

Non, il y a encore un moyen de le récupérer. Type git reflog et vous verrez une liste de shas de commit (partiels) dans lesquels vous vous êtes déplacé. Trouvez le commit que vous avez détruit, et faites ceci:

git checkout -b someNewBranchName shaYouDestroyed

Vous avez maintenant ressuscité ce commit. Les commits ne sont pas réellement détruits dans Git pendant 90 jours, donc vous pouvez généralement revenir en arrière et en sauver un que vous n'aviez pas l'intention de vous débarrasser.


9726
2018-05-29 18:16



Cela m'a pris du temps pour comprendre, alors peut-être que ça va aider quelqu'un ...

Vous pouvez annuler votre dernière validation de deux façons, selon que vous avez ou non déjà rendu public votre commit (envoyé à votre référentiel distant):

Comment annuler un commit local

Disons que je me suis engagé localement, mais que je veux maintenant 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 ce qu'il était avant le dernier commit, nous devons reset à l'engagement 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

À présent git log montrera que notre dernier commit a été supprimé.

Comment annuler un commit public

Si vous avez déjà rendu public vos validations, vous devrez créer un nouveau commit qui "annulera" les modifications que vous avez faites dans votre commit précédent (HEAD actuel).

git revert HEAD

Vos modifications seront maintenant annulées et prêtes à être validées:

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

Pour plus d'informations, consultez Git Basics - Annuler les choses


1744
2018-05-29 18:13



Ajouter / supprimer des fichiers pour obtenir les choses comme vous le souhaitez:

git rm classdir
git add sourcedir

Puis modifiez le commit:

git commit --amend

Le commit précédent, erroné, sera édité pour refléter le nouvel état de l'index - en d'autres termes, ce sera comme si vous n'aviez jamais fait l'erreur en premier lieu.

Notez que vous ne devriez le faire que si vous n'avez pas encore poussé. Si vous avez poussé, vous devrez juste commettre une correction normalement.


1623
2017-07-31 09:39



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 supprimera définitivement les modifications apportées à .java fichiers (et tous les autres fichiers) que vous vouliez valider.

le hard reset à HEAD-1 mettra votre copie de travail à l'état du commit avant votre mauvais commit.


875
2018-05-25 16:04



Pour changer le dernier commit

Remplacer les fichiers dans l'index:

git rm --cached *.class
git add *.java

Ensuite, si c'est une branche privée, modifier le commit:

git commit --amend

Ou, si c'est une branche partagée, faites un nouveau commit:

git commit -m 'Replace .class files with .java files'


(pour changer un commit précédent, utilisez le génial rebase interactif)


ProTip: Ajouter *.class à un gitignore pour empêcher que cela se reproduise.


Pour annuler un commit

La modification d'un commit est la solution idéale si vous avez besoin de changer le dernier commit, mais une solution plus générale est reset.

Vous pouvez réinitialiser git à n'importe quel commit avec:

git reset @~N

N est le nombre de commits avant HEAD, et @~ réinitialise à la validation précédente.

Ainsi, au lieu de modifier le commit, vous pouvez utiliser:

git reset @~
git add *.java
git commit -m "Add .java files"

Check-out git help reset, en particulier les sections sur --soft  --mixed et --hard, pour une meilleure compréhension de ce que cela fait.

Reflog

Si vous vous trompez, vous pouvez toujours utiliser le reflog pour trouver les commits tombés:

$ git reset @~
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~
2c52489 HEAD@{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started



677
2018-01-31 07:06



Utilisation git revert commit-id

Pour obtenir l'ID de validation, utilisez simplement git log


547
2017-12-13 10:18



Si vous prévoyez de défaire complètement un commit local, tout ce que vous changez vous l'avez fait sur le commit, et si vous ne vous en faites pas, faites simplement la commande suivante.

git reset --hard HEAD^1

(Cette commande ignorera votre commit entier et vos changements seront complètement perdus de votre arbre de travail local). Si vous voulez annuler votre commit, mais que vous voulez vos changements dans la zone de transfert (avant la validation, comme après git add) puis faites la commande suivante.

git reset --soft HEAD^1

Vos fichiers validés arrivent maintenant dans la zone de transit. Supposons que si vous voulez désassembler les fichiers, car vous devez éditer un mauvais conent, alors faites la commande suivante

git reset HEAD

Maintenant, les fichiers validés proviennent de la zone intermédiaire dans la zone non-staging. Maintenant, les fichiers sont prêts à être modifiés, donc tout ce que vous changez, vous voulez aller éditer et l'ajouter et faire une nouvelle / nouvelle validation.

Plus


440
2018-04-06 13:58