J'ai accidentellement validé les mauvais fichiers dans Git , mais je n'ai pas encore poussé la validation sur le serveur.
Comment annuler ces validations à partir du référentiel local?
git
version-control
git-commit
undo
pre-commit
Peter Mortensen
la source
la source
git undo
, c'est ça. Ensuite, le git de réputation a pour gérer les erreurs commises par nous simples mortels disparaît. Implémentez en poussant l'état actuel sur une pile git avant d'exécuter unegit
commande. Cela affecterait les performances, il serait donc préférable d'ajouter un indicateur de configuration pour l'activer.alias
fonctionnalité de Git : git-scm.com/book/en/v2/Git-Basics-Git-Aliasesgit reflog
est déjà proche de ce que vous décrivez, mais donne à l'utilisateur plus de contrôle sur ce qui doit (ne) pas être fait. Mais s'il vous plaît, non, "annuler" ne fonctionne pas de la même manière partout, et les gens s'attendraient à beaucoup de choses différentes pour la fonctionnalité. Annuler le dernier commit? Annuler la dernière action? Si la dernière action a été une poussée, annuler comment exactement (réinitialiser et pousser) ou (revenir en arrière et pousser)?Réponses:
Annuler un commit et refaire
git status
, vous devrez donc ajoutez-les à nouveau avant de valider). Si vous souhaitez uniquement ajouter d' autres modifications à la validation précédente ou modifier le message de validation 1 , vous pouvez utiliser à lagit reset --soft HEAD~
place, ce qui est commegit reset HEAD~
2 mais laisse vos modifications existantes par étapes.git add
tout ce que vous souhaitez inclure dans votre nouveau commit.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'ancien commit et vous permet de le modifier. Si vous n'avez pas besoin de modifier le message, vous pouvez utiliser l'-C
option.Attention, cependant, si vous avez ajouté de nouvelles modifications à l'index, l'utilisation
commit --amend
les ajoutera à votre commit précédent.Si le code est déjà envoyé à votre serveur et que vous avez les autorisations pour écraser l'historique (rebase), alors:
Vous pouvez également consulter cette réponse:
Comment puis-je déplacer HEAD vers un emplacement précédent? (Tête détachée) & Annuler les validations
La réponse ci-dessus vous montrera ce
git reflog,
qui est utilisé pour savoir quel est le SHA-1, que vous souhaitez annuler. Une fois que vous avez trouvé le point auquel vous souhaitez annuler l'utilisation de la séquence de commandes comme expliqué ci-dessus.1 Notez, cependant, que vous n'avez pas besoin de rétablir une validation antérieure si vous venez de faire une erreur dans votre message de validation . L'option la plus simple consiste à
git reset
(pour annuler toute modification que vous avez apportée depuis), puis àgit commit --amend
ouvrir votre éditeur de message de validation par défaut prérempli avec le dernier message de validation.2
HEAD~
est le même queHEAD~1
. Voir aussi Qu'est - ce que la tête dans git? . Il est utile si vous souhaitez annuler plusieurs validations.la source
git checkout theRightBranch
avec toutes les étapes de changement. Comme je venais de le faire.git reset --soft HEAD^
vous devrez utilisergit reset --soft HEAD~1
. Le ^ est un caractère de continuation sous DOS donc il ne fonctionnera pas correctement. En outre,--soft
c'est la valeur par défaut, vous pouvez donc l'omettre si vous le souhaitez et le diregit reset HEAD~1
.zsh: no matches found: HEAD^
- vous devez vous échapper ^ iegit reset --soft HEAD\^
git commit -a
été émise alors qu'elle-a
aurait dû être omise. Dans ce cas, il est préférable de ne pas laisser de côté--soft
(ce qui entraînera--mixed
la valeur par défaut) et vous pourrez alors reformater les modifications que vous vouliez valider.git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--chmod=(+|-)x] [--] [<pathspec>…]
Annuler une validation 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) est l'état de vos fichiers.
Vous voulez nuke commit C et ne plus jamais le voir et perdre toutes les modifications dans les fichiers modifiés localement . Tu fais cela:
Le résultat est:
Maintenant, B est la TÊTE. Parce que vous l'avez utilisé
--hard
, vos fichiers sont réinitialisés à leur état lors de la validation B.Ah, mais supposons que le commit C n'était pas un désastre, mais juste un peu décalé. Vous souhaitez annuler la validation mais conserver vos modifications pour un peu de modification avant de faire une meilleure validation. À partir d'ici, avec C comme TÊTE:
Vous pouvez le faire en laissant de côté
--hard
:Dans ce cas, le résultat est:
Dans les deux cas, HEAD n'est qu'un pointeur vers le dernier commit. Lorsque vous effectuez un
git reset HEAD~1
, vous dites à Git de reculer le pointeur HEAD d'un commit. Mais (sauf si vous l'utilisez--hard
), vous laissez vos fichiers tels qu'ils étaient. Affiche maintenantgit status
les modifications que vous avez enregistrées dans C. Vous n'avez rien perdu!Pour le toucher le plus léger, vous pouvez même annuler votre commit mais laisser vos fichiers et votre index :
Cela laisse non seulement vos fichiers seuls, mais laisse également votre index seul. Lorsque vous le ferez
git status
, vous verrez que les mêmes fichiers sont dans l'index que précédemment. En fait, juste après cette commande, vous pourriez le fairegit commit
et vous referiez le même commit que vous venez d'avoir.Encore une chose: supposons que vous détruisiez un commit comme dans le premier exemple, mais que vous découvriez ensuite que vous en aviez besoin après tout ? Pas de chance, non?
Non, il y a encore un moyen de le récupérer. Tapez
git reflog
et vous verrez une liste de shas de validation (partiels) (c'est-à-dire des hachages) dans lesquels vous vous êtes déplacé. Trouvez le commit que vous avez détruit, et procédez comme suit :Vous avez maintenant ressuscité ce commit. Les commits ne sont pas réellement détruits dans Git pendant environ 90 jours, vous pouvez donc généralement revenir en arrière et en sauver un dont vous ne vouliez pas vous débarrasser.
la source
git reset --hard~1
pointera la branche master vers le dernier commit à l'intérieur de la branche de fonctionnalité. Dans ce cas, l'ID de validation spécifique doit être utilisé à la place de la commande relative.--hard
mais ce que je ne savais pas, c'est que tous mes changements non mis en scène dans mon arbre de travail sont également supprimés! J'allais valider ces fichiers dans le cadre d'une validation ultérieure. Maintenant, il semble impossible de récupérer ces fichiers - j'ai même essayé la solution que vous avez publiée,reflog
mais cela n'a pas restauré les modifications précédemment non mises en scène.Il existe deux façons d'annuler votre dernier commit, selon que vous avez déjà rendu votre commit public (poussé vers votre référentiel distant):
Comment annuler un commit local
Disons que je me suis engagé localement, mais maintenant je veux supprimer ce commit.
Pour restaurer tout ce qu'il était avant le dernier commit, nous devons
reset
le faire avantHEAD
: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 souhaiterez créer un nouveau commit qui "reviendra" sur les modifications que vous avez apportées dans votre commit précédent (HEAD actuel).
Vos modifications seront désormais annulées et prêtes à être validées:
Pour plus d'informations, consultez Git Basics - Undoing Things .
la source
git revert HEAD^
n'est pas le précédent, est le précédent du précédent. Je l'ai fait:git revert HEAD
puis j'ai poussé à nouveau et cela a fonctionné :)Ajoutez / supprimez des fichiers pour obtenir les choses comme vous le souhaitez:
Modifiez ensuite le commit:
Le commit erroné précédent sera modifié pour refléter le nouvel état d'index - en d'autres termes, ce sera comme si vous n'aviez jamais fait l'erreur en premier lieu.
Notez que vous ne devez le faire que si vous n'avez pas encore poussé. Si vous avez poussé, vous n'aurez qu'à valider un correctif normalement.
la source
git rm --cached
pour conserver les fichiers dans le système de fichiers et ne les supprimez que de l'index git!ou
Avertissement: La commande ci-dessus supprimera définitivement les modifications des
.java
fichiers (et de tout autre fichier) que vous vouliez valider.Le
hard reset
toHEAD-1
mettra votre copie de travail à l'état de la validation avant votre mauvaise validation.la source
git commit -a -m ""
ougit commit -am ""
naturellement! :]git stash
, alors, alorsgit stash pop
Pour modifier le dernier commit
Remplacez les fichiers dans l'index:
Ensuite, s'il s'agit d'une branche privée, modifiez le commit:
Ou, si c'est une branche partagée, faites un nouveau commit:
( Pour modifier une validation précédente , utilisez la redéfinition interactive impressionnante .)
ProTip ™: Ajoutez
*.class
à un gitignore pour arrêter que cela se reproduise.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 l'est
reset
.Vous pouvez réinitialiser Git à n'importe quel commit avec:
Où
N
est le nombre de validations avantHEAD
et@~
revient à la validation précédente.Ainsi, au lieu de modifier le commit, vous pouvez utiliser:
Consultez
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 supprimés:
la source
git revert
s'agit d'une commande distincte - qui "réinitialise" essentiellement un commimt unique.Utilisez
git revert <commit-id>
.Pour obtenir l'ID de validation, utilisez simplement
git log
.la source
git revert commit-id
travaillé comme un charme. Bien sûr, vous devrez alors pousser vos modifications.git cherry-pick <<erroneous-commit-sha>>
@astronomerdave. De, M. Presque 2 ans de retard au parti.Si vous prévoyez d'annuler entièrement une validation locale, quelle que soit la modification que vous avez apportée à la validation, et si vous ne vous inquiétez de rien à ce sujet, exécutez simplement la commande suivante.
(Cette commande ignorera l'intégralité de votre commit et vos modifications seront complètement perdues de votre arborescence de travail locale). Si vous souhaitez annuler votre validation, mais que vous souhaitez apporter vos modifications dans la zone de transfert (avant la validation comme après
git add
), exécutez la commande suivante.Vos fichiers validés arrivent maintenant dans la zone de transfert. Supposons que si vous souhaitez mettre à niveau les fichiers, car vous devez modifier un contenu incorrect, exécutez la commande suivante
Maintenant, les fichiers validés doivent provenir de la zone intermédiaire dans la zone non intermédiaire. Les fichiers sont maintenant prêts à être modifiés, donc quoi que vous changiez, vous voulez aller le modifier et l'ajouter et faire un nouveau / nouveau commit.
Plus
la source
Si Git Extras est installé, vous pouvez exécuter
git undo
pour annuler la dernière validation.git undo 3
annulera les trois derniers commits.la source
Je voulais annuler les cinq derniers commits dans notre référentiel partagé. J'ai recherché l'ID de révision vers lequel je voulais revenir. Ensuite, j'ai tapé ce qui suit.
la source
Je préfère utiliser
git rebase -i
pour ce travail, car une belle liste apparaît où 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 validations que vous souhaitez lister, puis invoquez comme ceci (pour enrôler les trois derniers)
Exemple de liste
Ensuite, Git supprimera les validations pour toute ligne que vous supprimez.
la source
Comment corriger le commit local précédent
Utilisez git-gui (ou similaire) pour effectuer a
git commit --amend
. Depuis l'interface graphique, vous pouvez ajouter ou supprimer des fichiers individuels de la validation. Vous pouvez également modifier le message de validation.Comment annuler le commit local précédent
Réinitialisez simplement votre succursale à l'emplacement précédent (par exemple, en utilisant
gitk
ougit rebase
). Réappliquez ensuite vos modifications à partir d'une copie enregistrée. Après le garbage collection dans votre référentiel local, ce sera comme si la validation indésirable ne s'était jamais produite. Pour faire tout cela en une seule commande, utilisezgit reset HEAD~1
.Avertissement : l' utilisation imprudente de
git reset
est un bon moyen de mettre votre copie de travail dans un état déroutant. Je recommande aux novices 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 ...
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 de la branche privée dans le référentiel public
Cela peut être dangereux - assurez-vous d'avoir une copie locale de la branche à repousser.
Notez également: vous ne voulez pas faire cela si quelqu'un d'autre travaille sur la branche.
Nettoyez votre succursale localement puis repoussez ...
Dans le cas normal, vous n'avez probablement pas à vous soucier de l'historique de validation de votre branche privée. Poussez simplement un commit de suivi (voir 'Comment annuler un commit public' ci-dessus), et plus tard, faites un squash-merge pour masquer l'historique.
la source
gitk --all $(git reflog | cut -c1-7)&
peut être utile pour trouver la révision précédente si vous souhaitez annuler un commit '--amend'.git reset
git push origin (branch_name) --force
Si vous souhaitez l'annuler définitivement et que vous avez cloné un référentiel
L'ID de validation peut être vu par
Ensuite, vous pouvez faire -
la source
git reset --hard
, mais si vous devez supprimer durement les derniers "n" commits, vous spécifiez un SHASi vous avez commis des pourriels mais pas poussé,
OU
la source
HEAD~1
vous, vous pouvez utiliser le hachage réel comme affiché pargit log --stat
ou pargit reflog
- utile lorsque vous devez «annuler» plus d'un commit.Sur SourceTree (GUI pour GitHub), vous pouvez cliquer avec le bouton droit sur le commit et faire un «Reverse Commit». Cela devrait annuler vos modifications.
Sur le terminal:
Vous pouvez également utiliser:
Ou:
la source
Une seule commande:
Cela fonctionne très bien pour annuler le dernier commit local!
la source
Réinitialisez-le simplement en faisant la commande ci-dessous en utilisant
git
:Expliquez: qu'est
git reset
- ce que c'est, c'est essentiellementreset
à n'importe quel commit que vous souhaitez revenir, puis si vous le combinez avec la--soft
clé, il reviendra, mais gardez les modifications dans vos fichiers, donc vous revenez à l'étape auquel le fichier vient d'être ajouté,HEAD
est le chef de la branche et si vous combinez avec~1
(dans ce cas, vous utilisez égalementHEAD^
), il ne retournera qu'un seul commit ce que vous voulez ...Je crée les étapes dans l'image ci-dessous plus en détail pour vous, y compris toutes les étapes qui peuvent se produire dans des situations réelles et en validant le code:
la source
Comment annuler le dernier commit Git?
Pour restaurer tout ce qu'il était avant le dernier commit, nous devons réinitialiser le commit avant HEAD.
Si vous ne souhaitez pas conserver les modifications que vous avez apportées:
Si vous souhaitez conserver vos modifications:
Maintenant, vérifiez votre journal git. Cela montrera que notre dernier commit a été supprimé.
la source
"Réinitialiser l'arborescence de travail au dernier commit"
"Nettoyer les fichiers inconnus de l'arborescence de travail"
voir - Git Quick Reference
REMARQUE: cette commande supprimera votre commit précédent, utilisez-la donc avec prudence!
git reset --hard
est plus sûr.la source
Utilisez reflog pour trouver un état correct
REFLOG AVANT RÉINITIALISATION
Sélectionnez le reflog correct (f3cb6e2 dans mon cas) et tapez
Après cela, le repo HEAD sera réinitialisé à ce HEADid LOG AFTER RESET
Enfin le reflog ressemble à l'image ci-dessous
REFLOG FINAL
la source
Première exécution:
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:
la source
Annuler le dernier commit:
git reset --soft HEAD^
ougit reset --soft HEAD~
Cela annulera le dernier commit.
Ici
--soft
signifie réinitialiser la mise en scène.HEAD~
ouHEAD^
signifie se déplacer pour s'engager avant HEAD.Remplacer le dernier commit par un nouveau commit:
Il remplacera le dernier commit par le nouveau commit.
la source
Autrement:
Extrayez la branche que vous souhaitez rétablir, puis réinitialisez votre copie de travail locale sur le commit que vous souhaitez être la dernière sur le serveur distant (tout ce qui se passera ensuite au revoir). Pour ce faire, dans SourceTree, j'ai fait un clic droit sur le 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:
Cela effacera toutes les validations après celle en cours dans votre référentiel local, mais uniquement pour cette branche.
la source
Tapez
git log
et recherchez le dernier code de hachage de validation, puis entrez:la source
Dans mon cas, j'ai accidentellement commis des fichiers que je ne voulais pas. J'ai donc fait ce qui suit et cela a fonctionné:
Vérifiez les résultats avec gitk ou git log --stat
la source
Simple, exécutez ceci dans votre ligne de commande:
la source
Il y a plusieurs façons de procéder:
Commande Git pour annuler la dernière validation / les validations précédentes:
Avertissement: n'utilisez pas --hard si vous ne savez pas ce que vous faites. --hard est trop dangereux , et il pourrait supprimer vos fichiers.
La commande de base pour annuler le commit dans Git est:
ou
COMMIT-ID : ID du commit
n: est le nombre de dernières validations que vous souhaitez annuler
Vous pouvez obtenir l'ID de validation comme indiqué ci-dessous:
où d81d3f1 et be20eb8 sont l'ID de validation.
Voyons maintenant quelques cas:
Supposons que vous souhaitiez annuler le dernier commit 'd81d3f1'. Voici deux options:
ou
Supposons que vous souhaitiez annuler la validation 'be20eb8':
Pour des informations plus détaillées, vous pouvez également consulter et essayer d'autres commandes pour réinitialiser la tête à un état spécifié:
la source
git reset --hard HEAD~1
est trop dangereux ! Cela n'annulera pas seulement le dernier commit, mais ramènera complètement le repo au commit précédent. Vous perdrez donc toutes les modifications validées lors du dernier commit!git push -f <remote> HEAD@{1}:<branch>
Pour un commit local
ou si vous ne vous souvenez pas exactement dans quel commit il se trouve, vous pouvez utiliser
Pour un commit poussé
La bonne façon de supprimer des fichiers de l'historique du référentiel est d'utiliser
git filter-branch
. C'est,Mais je vous recommande d'utiliser cette commande avec soin. Pour en savoir plus, consultez la page de manuel git-filter-branch (1) .
la source
Il existe deux scénarios principaux
Vous n'avez pas encore poussé le commit
Si le problème était des fichiers supplémentaires que vous avez validés (et que vous ne voulez pas qu'ils soient dans le référentiel), vous pouvez les supprimer en utilisant
git rm
puis en validant avec--amend
Vous pouvez également supprimer des répertoires entiers avec
-r
, ou même combiner avec d'autres commandes BashAprès avoir supprimé les fichiers, vous pouvez valider, avec l' option --amend
Cela réécrira votre commit local récent en supprimant les fichiers supplémentaires, donc, ces fichiers ne seront jamais envoyés en push et seront également supprimés de votre dépôt local .git par GC.
Vous avez déjà poussé le commit
Vous pouvez appliquer la même solution de l'autre scénario et ensuite faire
git push
avec l'-f
option, mais ce 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 effectuer la validation sans
--amend
(rappelez-vous ceci à propos de -amend`: cette option réécrit l'historique sur la dernière validation).la source
Pour rétablir la révision précédente, supprimer définitivement toutes les modifications non validées:
la source
--soft
pour conserver vos modificationsuncommitted changes
,--hard
pour neutraliser complètement le commit et revenir en arrière par un. N'oubliez pas de faire de telles opérations uniquement sur des modifications qui ne sont pas encore poussées.git reset --hard
.git
stocke son contenu dans sa base de données d'objets. Le contenu stocké n'est supprimé que lorsque le garbage collection est exécuté. Il est donc possible de récupérer la dernière version intermédiaire d'un fichier qui n'était pas actuellement en cours d'git reset --hard
exécution lors de son exécution (voir les articles liés ci-dessus pour plus d'informations).