supprimer Comment annuler les derniers commits dans Git?




git supprimer fichier commit (24)

Pour changer le dernier commit

Remplacez les fichiers dans l'index:

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

Ensuite, s'il s'agit d'une branche privée, modifiez le commit:

git commit --amend

Ou, s'il s'agit d'une branche partagée, effectuez un nouveau commit:

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


( pour changer un commit précédent , utilisez l'impressionnante base interactive )

ProTip ™: Ajoutez *.class à un gitignore pour que cela ne se reproduise plus.

Pour annuler un commit

La modification d'un commit est la solution idéale si vous devez modifier 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 validations avant HEAD et @~ réinitialise le commit précédent.

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

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

Consultez l’ git help reset , en particulier les sections sur --soft --mixed et --hard , pour mieux comprendre en quoi cela --hard .

Reflog

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

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


J'ai accidentellement envoyé les mauvais fichiers à Git , mais je n'ai pas encore envoyé le commit au serveur.

Comment puis-je annuler ces commits du référentiel local?


Tapez git log et recherchez le dernier code de hachage de validation, puis entrez:

git reset <the previous co>

Je voulais annuler les 5 derniers commits de notre référentiel partagé. J'ai regardé l'identifiant de révision que je voulais restaurer. Ensuite, j'ai tapé ce qui suit.

prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
prompt> git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To [email protected]:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>

Utiliser git revert commit-id

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


Autrement:

Vérifiez la branche que vous souhaitez rétablir, puis réinitialisez votre copie de travail locale sur le commit que vous souhaitez être le plus récent sur le serveur distant (tout ce qui suivra sera répété au-delà). Pour ce faire, dans SourceTree, j'ai cliqué avec le bouton droit de la souris sur et sélectionné "Réinitialiser BRANCHNAME à ce commit".

Ensuite, accédez au répertoire local de votre référentiel et exécutez cette commande:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

Cela effacera toutes les validations postérieures à celle en cours dans votre référentiel local, mais uniquement pour cette branche.


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 faire cela que si vous n'avez pas encore poussé. Si vous avez poussé, alors vous devrez simplement commettre un correctif normalement.


Il y a deux scénarios principaux

Vous n'avez pas encore poussé le commit

Si le problème concerne des fichiers supplémentaires que vous avez validés (et que vous ne voulez pas ceux-ci sur le référentiel), vous pouvez les supprimer en utilisant git rm puis en les validant avec --amend

git rm <pathToFile>

Vous pouvez également supprimer des répertoires entiers avec -r , ou même les combiner avec d'autres commandes Bash

git rm -r <pathToDirectory>
git rm $(find -name '*.class')

Après avoir supprimé les fichiers, vous pouvez commettre, avec l'option --amend

git commit --amend -C HEAD # the -C option is to use the same commit message

Cela réécrira votre récent commit local en supprimant les fichiers supplémentaires. Par conséquent, ces fichiers ne seront jamais envoyés en mode Push et seront également supprimés de votre référentiel .git local par le GC.

Vous avez déjà poussé le commit

Vous pouvez appliquer la même solution de l'autre scénario, puis utiliser git push avec l'option -f , mais cela n'est pas recommandé, car il écrase l'historique distant avec une modification divergente (cela peut gâcher votre référentiel).

Au lieu de cela, vous devez faire le commit sans --amend (rappelez-vous ceci à propos de -amend`: Cette option réécrit l’historique du dernier commit).


Je préfère utiliser git rebase -i pour ce travail, car une belle liste apparaît dans laquelle je peux choisir les commits à supprimer. Ce n'est peut-être pas aussi direct que d'autres réponses ici, mais cela semble juste .

Choisissez le nombre de commits que vous voulez lister, puis appelez comme ceci (pour inscrire les trois derniers)

git rebase -i HEAD~3

Liste d'échantillons

pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support

Ensuite, git supprimera les commits pour toutes les lignes que vous supprimez.


Si vous prévoyez d'annuler entièrement un commit local, quel que soit ce que vous avez changé, vous l'avez fait, et si vous ne vous inquiétez de rien, faites simplement la commande suivante.

git reset --hard HEAD^1

(Cette commande ignorera la totalité de votre commit et vos modifications seront complètement perdues de votre arbre de travail local). Si vous souhaitez annuler votre validation, mais que vous souhaitez que vos modifications soient apportées dans la zone de préparation (avant la validation, exactement comme après git add ), exécutez la commande suivante.

git reset --soft HEAD^1

Maintenant, vos fichiers validés entrent dans la zone de transfert. Supposons que si vous souhaitez créer des fichiers en amont, car vous devez modifier un contenu erroné, procédez comme suit:

git reset HEAD

Maintenant, les fichiers validés doivent provenir de la zone préparée dans la zone non préparée. Les fichiers sont maintenant prêts à être modifiés. Ainsi, quels que soient vos changements, vous souhaitez les modifier, les ajouter et effectuer un nouveau / nouveau commit.

More


Utilisez reflog pour trouver un état correct

git reflog

REFLOG AVANT RESET

Sélectionnez le bon reflog (f3cb6e2 dans mon cas) et tapez

git reset --hard f3cb6e2

Après cela, le rapport HEAD sera réinitialisé sur ce HEADid. JOURNAL APRES RESET

Enfin, le reflog ressemble à l'image ci-dessous

REFLOG FINAL


Cela m'a pris un certain temps à comprendre, alors peut-être que cela aidera quelqu'un ...

Il y a deux façons d'annuler votre dernier commit, selon que vous avez déjà rendu public votre commit (poussé vers votre référentiel distant):

Comment annuler un commit local

Supposons que je me suis engagé localement, mais que je veuille 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 que tout redevienne comme avant la dernière validation, nous devons reset la validation 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 commit public

Si vous avez déjà rendu vos commits publics, vous voudrez créer un nouveau commit qui "annulera" les modifications que vous avez apportées à votre précédent commit (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 - Undoing Things


Dans mon cas, j'ai accidentellement commis des fichiers que je ne voulais pas. Alors j'ai fait ce qui suit et cela a fonctionné:

git reset --soft HEAD^
git rm --cached [files you do not need]
git add [files you need]
git commit -c ORIG_HEAD

Vérifiez les résultats avec gitk ou git log --stat


Si vous souhaitez supprimer des fichiers lors de la dernière validation, vous pouvez utiliser ceci:

git reset --hard HEAD~1

Et si besoin de fichiers dans le dernier commit, vous pouvez utiliser ceci:

git reset --soft HEAD~1

"Réinitialiser l'arbre de travail au dernier commit"

git reset --hard HEAD^ 

"Nettoyer les fichiers inconnus de l'arbre de travail"

git clean    

voir - Référence rapide Git

NOTE: Cette commande supprimera votre commit précédent, donc utilisez avec précaution! git reset --hard est plus sûr -


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

Supposons que vous ayez ceci, où C est votre HEAD et (F) l’état de vos fichiers.

   (F)
A-B-C
    ↑
  master

Vous voulez neutraliser le commit C et ne plus 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 de validation B.

Ah, mais supposons que commit C n'était pas un désastre, mais juste un peu en retrait. Vous voulez annuler la validation mais garder vos modifications pour un peu de modification avant de faire une meilleure validation. En partant d’ici, avec C pour tête:

   (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. Lorsque vous effectuez une git reset HEAD~1 par git reset HEAD~1 , vous indiquez à Git de déplacer le pointeur HEAD en arrière d'un commit. Mais (sauf si vous utilisez --hard ), vous laissez vos fichiers tels qu’ils étaient. Alors maintenant, le git status montre les changements que vous avez enregistrés dans C. Vous n'avez rien perdu!

Pour un toucher plus léger, vous pouvez même annuler votre commit mais laisser vos fichiers et votre index :

git reset --soft HEAD~1

Cela laisse non seulement vos fichiers seuls, mais également votre index . Lorsque vous faites le git status , vous verrez que les mêmes fichiers sont dans l'index comme auparavant. En fait, juste après cette commande, vous pourriez faire git commit et refaire le même commit que vous venez de recevoir.

Une dernière chose: supposons que vous détruisiez un commit comme dans le premier exemple, mais que vous en découvriez ensuite le besoin ? Pas de chance, non?

Non, il y a encore un moyen de le récupérer. Tapez git reflog et vous verrez une liste des shams (partiels) de commit que vous avez déplacés. Trouvez le commit que vous avez détruit et procédez comme suit:

git checkout -b someNewBranchName shaYouDestroyed

Vous avez maintenant ressuscité ce commit. En réalité, les commits ne sont pas détruits à Git pendant environ 90 jours. Vous pouvez donc généralement y revenir et en sauver un dont vous ne vouliez pas vous débarrasser.


Comment réparer le commit local précédent

Utilisez git-gui (ou similaire) pour effectuer un git commit --amend . À partir de l'interface graphique, vous pouvez ajouter ou supprimer des fichiers individuels du commit. Vous pouvez également modifier le message de validation.

Comment annuler le commit local précédent

Il suffit de réinitialiser votre branche à l’emplacement précédent (par exemple, en utilisant gitk ou git rebase ). Réappliquez ensuite vos modifications à partir d'une copie sauvegardée. Après la récupération de place dans votre référentiel local, ce sera comme si la validation non désirée n’était jamais arrivée. Pour faire tout cela en une seule commande, utilisez git reset HEAD~1 .

Mot d'avertissement : Une utilisation négligente de la git reset de git reset est un bon moyen de rendre votre copie de travail dans un état confus. Je recommande aux novices de Git d'éviter cela s'ils le peuvent.

Comment annuler un commit public

Effectuez une sélection inversée ( git-revert ) pour annuler les modifications.

Si vous n'avez pas encore apporté d'autres modifications à votre branche, vous pouvez simplement le faire ...

git revert --no-edit HEAD

Poussez ensuite votre branche mise à jour vers le référentiel partagé.

L'historique des validations affichera les deux validations séparément .

Avancé: Correction d' une branche privée dans un référentiel public

Cela peut être dangereux - assurez-vous de disposer d'une copie locale de la branche à repush.

Remarque: vous ne voulez pas faire cela si quelqu'un d'autre travaille sur la branche.

git push --delete (branch_name) ## remove public version of branch

Nettoyez votre branche localement puis repush ...

git push origin (branch_name)

Dans le cas normal, vous n'avez probablement pas à vous soucier de l'historique de vos commits de branche privée. Il suffit de pousser un commit ultérieur (voir "Comment annuler un commit public" ci-dessus), et plus tard, effectuez une squash-merge masquage pour masquer l'historique.


Si vous avez commis des junk mais pas poussé,

git reset --soft HEAD~1

HEAD ~ 1 est un raccourci pour le commit avant head. Sinon, vous pouvez vous référer au SHA-1 du hachage si vous souhaitez réinitialiser. L' option --soft supprimera la validation mais laissera tous vos fichiers modifiés "Les modifications à valider", comme le dirait le statut de git.

Si vous souhaitez vous débarrasser de toute modification apportée aux fichiers suivis dans l’arbre de travail depuis la validation avant l’utilisation de la tête, utilisez « --hard » à la place.

OU

Si vous avez déjà poussé et que quelqu'un ait tiré ce qui est généralement mon cas, vous ne pouvez pas utiliser la réinitialisation git . Vous pouvez cependant faire un git revert ,

git revert HEAD

Cela créera un nouveau commit qui annule tout ce qui a été introduit par le commit accidentel.


Première exécution:

git reflog

Il vous montrera toutes les actions possibles que vous avez effectuées sur votre référentiel, par exemple, valider, fusionner, extraire, etc.

Alors fais:

git reset --hard ActionIdFromRefLog

Sur SourceTree (interface graphique pour GitHub), vous pouvez cliquer avec le bouton droit de la souris sur le commit et effectuer un 'Reverse Commit'. Cela devrait annuler vos modifications.

Sur le terminal:

Vous pouvez également utiliser:

git revert

Ou:

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 your changes.

Simple, lancez ceci dans votre ligne de commande:

git reset --soft HEAD~ 

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

ou

git reset --hard HEAD~1

Avertissement: La commande ci-dessus supprimera définitivement les modifications apportées aux fichiers .java (et à tout autre fichier) que vous vouliez valider.

La hard reset à HEAD-1 définira votre copie de travail sur l'état du commit avant votre commit incorrect.


Il suffit de le réinitialiser en utilisant la commande ci-dessous avec git :

git reset --soft HEAD~1

Expliquez ce que git reset fait, il est essentiellement reset sur n'importe quel commit --soft vous souhaitez revenir, puis si vous le combinez avec la touche --soft , il reviendra en arrière, mais gardez les modifications dans vos fichiers, vous revenez à l'étape où le fichier vient d'être ajouté, HEAD est le responsable de la branche et si vous combinez avec ~1 (dans ce cas, vous utilisez également HEAD^ ), il ne retournera qu'un seul commit avec ce que vous voulez. ..

Je crée les étapes dans l'image ci-dessous de manière plus détaillée pour vous, y compris toutes les étapes pouvant se produire dans des situations réelles et commettant le code:


Si vous avez installé Git Extras , vous pouvez lancer git undo pour annuler le dernier commit. git undo 3 annulera les 3 derniers commits.


Si vous voulez l'annuler définitivement et que vous avez cloné un référentiel

L'identifiant de commit peut être vu par

git log 

Ensuite, vous pouvez faire -

git reset --hard <commit_id>

git push origin <branch_name> -f






git-revert