Comment annuler la validation du dernier commit git non poussé sans perdre les modifications

541

Existe-t-il un moyen de rétablir une validation afin que ma copie locale conserve les modifications apportées dans cette validation, mais qu'elles deviennent des modifications non validées dans ma copie de travail? La restauration d'une validation vous ramène à la validation précédente - je souhaite conserver les modifications apportées, mais je les ai validées dans la mauvaise branche.

Cela n'a pas été poussé, seulement commis.

Mr. Boy
la source
6
git reset --softet les git reset --mixeddeux le font (un peu différemment), voir git-reset
torek

Réponses:

933

Il existe de nombreuses façons de le faire, par exemple:

au cas où vous n'auriez pas encore poussé le commit publiquement:

git reset HEAD~1 --soft   

Voilà, vos modifications de validation seront dans votre répertoire de travail, tandis que la dernière validation sera supprimée de votre branche actuelle. Voir git reset man


Si vous avez fait pousser publiquement (sur une branche appelée « maître »):

git checkout -b MyCommit //save your commit in a separate branch just in case (so you don't have to dig it from reflog in case you screw up :) )

revenir valider normalement et pousser

git checkout master
git revert a8172f36 #hash of the commit you want to destroy
# this introduces a new commit (say, it's hash is 86b48ba) which removes changes, introduced in the commit in question (but those changes are still visible in the history)
git push origin master

maintenant si vous voulez avoir ces changements comme vous les modifications locales dans votre copie de travail ("afin que votre copie locale conserve les modifications apportées dans ce commit") - il suffit de rétablir le commit de retour avec l' --no-commitoption:

git revert --no-commit 86b48ba (hash of the revert commit).

J'ai conçu un petit exemple: https://github.com/Isantipov/git-revert/commits/master

Isantipov
la source
5
merci beaucoup, dans mon cas, j'ai eu deux commits que je voulais annuler, et exécuter 'git reset HEAD ~ 1 --soft' deux fois de suite m'a amené là où je devais être.
Geoff Gunter
2
pour ajouter un peu de clarté si vous n'utilisez pas CLI, la première resetcommande mentionnée dit de réinitialiser "doucement" à 1 tour avant la tête, ce qui préserve tous les changements locaux. ce n'était pas immédiatement évident pour moi pour une utilisation dans SourceTree. assurez-vous simplement que vous réinitialisez doucement la version précédente, et non la version que vous essayez de réinitialiser
Jon B
1
J'ai essayé l'approche "déjà poussée" et ça ne marche pas pour moi, avec git 2.14.1: ça dit "Already up to date"quand on fait la fusion.
Fabio A.
1
@FabioA. , J'ai mis à jour la réponse avec une version de travail. Merci de l'avoir remarqué!
Isantipov
1
Ça ne marche pas. J'ai sauté la réinitialisation et la validation et seulement le git est revenu et repoussé ... maintenant peut-être que les modifications ont été perdues pas encore ... heureusement, j'ai fait une sauvegarde de la manière la plus simple, j'espère que celle-ci fonctionnera encore;) sinon, je peux copier les modifications de celle-ci .
Skybuck Flying
13

Si vous avez poussé les modifications, vous pouvez le undofaire et remettre les fichiers sur scène sans utiliser une autre branche.

git show HEAD > patch
git revert HEAD
git apply patch

Il créera un fichier de correctif contenant les dernières modifications de branche. Ensuite, il annule les modifications. Et enfin, appliquez les fichiers de correctifs à l'arborescence de travail.

Aminadav Glickshtein
la source
vous pouvez rm patchaussi vouloir
Max Coplan
6

Pour le cas: "Cela n'a pas été poussé, seulement commis ." - si vous utilisez IntelliJ (ou un autre IDE JetBrains) et que vous n'avez pas encore poussé les modifications, vous pouvez le faire ensuite.

  1. Accédez à la fenêtre Contrôle de version ( Alt + 9 / Commande + 9 ) - onglet "Journal".
  2. Faites un clic droit sur un commit avant le dernier.
  3. Réinitialiser la branche actuelle ici
  4. choisissez Soft (!!!)
  5. appuyez sur le bouton Réinitialiser en bas de la fenêtre de dialogue.

Terminé.

Cela "désengagera" vos modifications et ramènera votre statut git au point avant votre dernier commit local. Vous ne perdrez aucune des modifications que vous avez apportées.

Eduard Streltsov
la source
2
J'adore apprendre la méthode JetBrains, merci! C'est équivalent à git reset --soft "HEAD^"Windows, btw. :)
payne
3

Avec moi, cela se produit principalement lorsque je pousse les modifications dans la mauvaise branche et que je m'en rends compte plus tard. Et les travaux suivants la plupart du temps.

git revert commit-hash
git push

git checkout my-other-branch
git revert revert-commit-hash
git push
  1. annuler le commit
  2. (créer et) extraire une autre branche
  3. revenir le retour
Mubashar
la source
1
J'ai testé ça. Votre approche fonctionne également si vous n'avez pas poussé vers la télécommande. $ git revert <commit-hash> ... puis extrayez une autre branche, puis tapez $ git revert <revert-commit-hash> (sans les push). Merci de partager cette approche simple !!
Natalie Cottrill
2

2020 façon simple:

git reset <commit_hash>

Validez le hachage du dernier commit que vous souhaitez conserver.

Xys
la source
1

Veuillez vous assurer de sauvegarder vos modifications avant d'exécuter ces commandes dans un dossier séparé

git checkout nom_branche

Commander dans votre agence

git merge --abort

Annuler la fusion

statut git

Vérifier l'état du code après avoir abandonné la fusion

git reset --hard origin / branch_name

cette commande réinitialisera vos modifications et alignera votre code avec le code branch_name (branch).

Mohit Singh
la source