Git – Annuler les commits

J’ai un projet dans un référentiel distant, synchronisé avec un référentiel local (développement) et le serveur un (prod). J’ai apporté des modifications commises déjà poussées à distance et tirées du serveur. Maintenant, je veux annuler ces changements. Donc, je pourrais simplement git checkout à la validation avant les modifications et valider les nouvelles modifications, mais je suppose qu’il y aura des problèmes pour les repousser à distance. Toute suggestion sur comment dois-je procéder?

Vous pouvez rétablir les commits individuels avec:

 git revert  

Cela créera une nouvelle validation qui annulera les modifications de la validation spécifiée. Notez que cela ne fait que rétablir cette validation spécifique et ne pas valider après cela. Si vous voulez annuler une série de validations, vous pouvez le faire comme ceci:

 git revert .. 

Il annule les validations entre et incluant les commits spécifiés.

Regardez la page de manuel git-revert pour plus d’informations sur la commande git revert . Consultez également cette réponse pour plus d’informations sur la restauration des commits.

Une solution qui ne garde aucune trace du “défaire”.

NOTE: ne le faites pas si quelqu’un a déjà tiré votre changement (je ne l’utiliserais que sur mon repo personnel)

faire:

 git reset  

ceci ré-parsingra toutes les mises à jour localement (ainsi l’état de git listera tous les fichiers mis à jour)

alors vous “faites votre travail” et vous réengagez vos modifications (Note: cette étape est facultative)

 git commit -am "blabla" 

À ce moment, votre arbre local diffère de la télécommande

 git push -f   

va pousser et forcer remote à considérer ce push et à supprimer le précédent (spécifier le nom-distant et le nom-twig n’est pas obligatoire mais il est recommandé d’éviter de mettre à jour toutes les twigs avec l’indicateur update).

!! watch-out certains tags peuvent encore pointer supprimés commit !! comment-supprimer-un-tag-distant

Ce que je fais dans ces cas est:

  • Dans le serveur, déplacez le curseur sur le dernier bon commit connu:

     git push -f origin : 
  • Localement, faites la même chose:

     git reset --hard  # ^^^^^^ # optional 



Voir un exemple complet sur une twig my_new_branch que j’ai créée à cet effet:

 $ git branch my_new_branch 

Voici l’histoire récente après avoir ajouté des éléments à myfile.py :

 $ git log commit 80143bcaaca77963a47c211a9cbe664d5448d546 Author: me Date: Wed Mar 23 12:48:03 2016 +0100 Adding new stuff in myfile.py commit b4zad078237fa48746a4feb6517fa409f6bf238e Author: me Date: Tue Mar 18 12:46:59 2016 +0100 Initial commit 

Je veux me débarrasser du dernier commit, qui a déjà été poussé, donc je cours:

 $ git push -f origin b4zad078237fa48746a4feb6517fa409f6bf238e:my_new_branch Total 0 (delta 0), reused 0 (delta 0) To git@github.com:me/myrepo.git + 80143bc...b4zad07 b4zad078237fa48746a4feb6517fa409f6bf238e -> my_new_branch (forced update) 

Agréable! Maintenant, je vois que le fichier qui a été modifié sur ce commit ( myfile.py ) apparaît dans “not myfile.py for commit”:

 $ git status On branch my_new_branch Your branch is up-to-date with 'origin/my_new_branch'. Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: myfile.py no changes added to commit (use "git add" and/or "git commit -a") 

Comme je ne veux pas ces changements, je déplace simplement le curseur localement aussi:

 $ git reset --hard b4zad078237fa48746a4feb6517fa409f6bf238e HEAD is now at b4zad07 Initial commit 

Alors maintenant, HEAD est dans le commit précédent, à la fois en local et à distance:

 $ git log commit b4zad078237fa48746a4feb6517fa409f6bf238e Author: me Date: Tue Mar 18 12:46:59 2016 +0100 Initial commit 

Vous pouvez REVERT (ou vous pouvez aussi l’appeler DELETE ) le Git Commit BOTH localement et à distance si vous suivez les étapes indiquées ci-dessous via la ligne de commande git.

Exécutez la commande suivante pour voir l’ID de validation que vous souhaitez rétablir

 git log --oneline --decorate --graph 

Vous obtiendrez comme une capture d’écran suivante entrer la description de l'image ici

Si vous vérifiez également à distance (via l’Interface Web), vous pouvez voir que ce serait comme ci-dessous

entrer la description de l'image ici

Comme pour la capture d’écran actuellement, vous êtes sur l’ID de validation e110322 mais vous voulez revenir à 030bbf6 LOCALY et REMOTELY .

Effectuez les étapes suivantes pour SUPPRIMER / REVERT Valider localement + à distance


Premier retour local pour valider l’ID 030bbf6

 git reset --hard 030bbf6 

suivi par

 git clean -f -d 

Ces deux commandes nettoient la force pour valider l’étape 030bbf6 comme indiqué ci-dessous dans la capture d’écran

entrer la description de l'image ici

maintenant, si vous lancez git status, vous verrez que vous êtes DEUX Commits derrière la twig distante comme indiqué ci-dessous entrer la description de l'image ici

Exécutez la suite pour mettre à jour vos index (s’il y a des mises à jour). Il est recommandé de demander à tous les développeurs de n’accepter aucune requête de tirage sur la twig distante principale.

 git fetch --all 

Une fois que vous en avez fini avec cela, vous devez appuyer sur ce commit avec force en utilisant le symbole + devant la twig, comme indiqué ci-dessous. J’ai utilisé ici comme twig principale, vous pouvez le remplacer par n’importe quel

entrer la description de l'image ici Code

 git push -u origin +master 

maintenant, si vous voyez l’interface Web de remote, la validation doit également être rétablie.

entrer la description de l'image ici

 git revert HEAD -m 1 

Dans la ligne de code ci-dessus. “Le dernier argument représente”

  • 1 – rétablit un commit.

  • 2 – rétablit les deux derniers commits.

  • n – retourne les n derniers commits.

Vous devez appuyer sur cette commande pour prendre effet sur la télécommande. Vous avez d’autres options, telles que la spécification de la plage de validation à rétablir. C’est l’une des options.


Plus tard, utilisez git commit -am "COMMIT_MESSAGE" puis git push ou git push -f