Découvrez comment annuler des changements dans Git à l'aide de Bitbucket Cloud
Objectif
Découvrez comment annuler des changements sur votre machine locale et dans un dépôt Bitbucket Cloud, tout en collaborant avec d'autres utilisateurs.
Mission
Voici la liste des commandes couvertes dans ce tutoriel :
- git revert, git reset, git log et git status
Durée
40 minutes
Public
Ce tutoriel suppose une certaine connaissance des commandes Git suivantes : git clone
, git commit
, git pull
et git push
Tout le monde fait des erreurs. Aucun push n'est parfait, c'est pourquoi ce tutoriel vous aidera à utiliser les fonctions Git les plus courantes pour annuler un ou plusieurs changements en toute sécurité.
Ce tutoriel suppose une certaine connaissance des commandes Git suivantes :
Si vous ne connaissez pas ces commandes, nous pouvons vous aider : Découvrez Git avec Bitbucket Cloud. Revenez ensuite ici pour apprendre à annuler les changements. Ces commandes Git
sont applicables à un environnement Windows ou Unix. Ce tutoriel utilisera des utilitaires de ligne de commande Unix pour la navigation dans le système de fichiers.
Annuler des changements sur votre machine locale
Lorsque le changement que vous souhaitez annuler se trouve sur votre système local et n'a pas été pushé vers un dépôt distant, il existe deux façons principales de l'annuler :
Commande | Définition |
---|---|
| Définition Une commande d'« annulation », mais pas une opération d'annulation classique. Au lieu de supprimer le commit, elle détermine comment inverser les changements dans le commit, puis ajoute un nouveau commit avec le contenu inverse. Ainsi, Git ne perd pas l'historique, lequel est important pour l'intégrité de votre historique de révision et pour une collaboration fiable. |
| Définition
Une commande
Pour une description complète du fonctionnement de |
DÉCOUVRIR LA SOLUTION
Tutoriels Git avancés
Ressource connexe
Commandes Git
Au fur et à mesure de votre avancement dans le tutoriel, vous découvrirez plusieurs autres commandes Git en apprenant à annuler des changements. C'est parti !
Forker un dépôt
Commençons par créer un dépôt unique, qui comprend l'ensemble du code du dépôt d'origine. Ce processus est appelé « forker un dépôt ». Le fork est un processus Git
étendu qui est possible lorsqu'un dépôt partagé est hébergé à l'aide d'un service d'hébergement tiers, comme Bitbucket.
1. Cliquez sur l'URL suivante ou saisissez-la : https://bitbucket.org/atlassian/tutorial-documentation-tests/commits/all
Cliquez sur le symbole + dans la barre latérale gauche, puis sélectionnez Fork this repository (Forker ce dépôt), passez en revue la boîte de dialogue, puis cliquez sur Fork repository (Forker le dépôt).
3. Vous devriez être redirigé vers l'aperçu du nouveau dépôt.
4. Cliquez sur le symbole + et sélectionnez Clone this repository (Cloner ce dépôt).
5. Sur votre ordinateur, clonez le dépôt.
6. Accédez au répertoire contenant le dépôt cloné.
Maintenant que vous disposez d'un dépôt rempli de code et d'un historique existant sur votre système local, vous êtes prêt à commencer à annuler certains changements.
Rechercher des changements sur votre système local
Vous devrez être capable de trouver et de référencer le changement que vous voulez annuler. Pour ce faire, vous pouvez parcourir l'interface utilisateur de commit sur Bitbucket. Par ailleurs, il existe quelques utilitaires de ligne de commande capables de localiser un changement spécifique.
git status
Vous devrez être capable de trouver et de référencer le changement que vous voulez annuler. Pour ce faire, vous pouvez parcourir l'interface utilisateur de commit sur Bitbucket. Par ailleurs, il existe quelques utilitaires de ligne de commande capables de localiser un changement spécifique.
$ git status
On branch main
Your branch is up-to-date with 'origin/main'.
nothing to commit, working tree clean
La sortie de git status
ci-dessus nous montre que tout est à jour avec la branche principale à distance et qu'aucun changement n'est en attente de commit. Dans l'exemple suivant, nous allons effectuer quelques éditions dans le dépôt, et l'examiner à l'état « Changements en attente ». Cela signifie que le dépôt sur votre système local contient des changements de fichiers que vous n'avez pas préparés (ou stagés) pour les ajouter à l'historique du projet.
Pour illustrer l'exemple suivant, ouvrez d'abord le fichier myquote2.html
. Apportez certains changements au contenu de myquote2.html
, enregistrez, puis quittez le fichier. Exécutons à nouveau git status
pour examiner le dépôt à cet état.
$ git status
On branch main
Your branch is up-to-date with 'origin/main'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
Modified: myquote2.html
no changes added to commit (use "git add" and/or "git commit -a")
--
La sortie ci-dessus montre que des changements sont en attente dans le dépôt pour myquote2.html
. Bonne nouvelle ! Si le changement que vous voulez annuler n'a pas encore été ajouté à la zone de staging, comme dans l'exemple ci-dessus, vous pouvez simplement modifier le fichier et continuer. Git ne commence à suivre un changement que lorsque vous l'ajoutez à la zone de staging et que vous le commitez dans l'historique du projet.
Annulons à présent les changements que nous avons apportés à myquote2.html
. Comme il s'agit d'un exemple simplifié avec des changements minimaux, nous disposons de deux méthodes pour annuler les changements. Si nous exécutons git checkout myquote2.html
, le dépôt restaurera myquote2.html
à la version précédemment commitée. Nous pouvons également exécuter git reset --hard
pour restaurer tout le dépôt à l'état du dernier commit.
Git log
La commande git log
vous permet de lister l'historique du projet, de le filtrer et de rechercher des changements spécifiques. Alors que git status
vous permet d'inspecter le répertoire de travail et la zone de staging, git log
affiche uniquement l'historique commité.
Vous retrouverez cette entrée de journal de l'historique des commits dans l'interface utilisateur de Bitbucket en accédant à la vue « commits » d'un dépôt. La vue « commits » de notre dépôt de démo se trouve à l'adresse suivante : https://bitbucket.org/dans9190/tutorial-documentation-tests/commits/all. Cette vue affiche une sortie similaire à celle de l'utilitaire de ligne de commande git log
. Elle peut être utilisée pour trouver et identifier un commit à annuler.
Dans l'exemple suivant, vous pouvez voir plusieurs choses dans l'historique, mais chaque changement est, à la base, un commit. C'est donc ce que nous devons trouver et annuler.
$ git status
On branch main
Your branch is up-to-date with 'origin/main'.
nothing to commit, working tree clean
$ git log
commit 1f08a70e28d84d5034a8076db9103f22ec2e982c
Author: Daniel Stevens <dstevens@atlassian.com>
Date: Wed Feb 7 17:06:50 2018 +0000
Initial Bitbucket Pipelines configuration
commit 52f823ca251a132225dd1cc18ad768de8d336e84
Author: Daniel Stevens <dstevens@atlassian.com>
Date: Fri Sep 30 15:50:58 2016 -0700
repeated quote to show how a change moves through the process
commit 4801b87c2147dce83f1bf31acfcffa6cb1d7e0a5
Merge: 1a6a403 3b29606
Author: Dan Stevens [Atlassian] <dstevens@atlassian.com>
Date: Fri Jul 29 18:45:34 2016 +0000
Merged in changes (pull request #6)
Changes
Examinons d'un peu plus près l'un des commits de la liste :
commit 52f823ca251a132225dd1cc18ad768de8d336e84
Author: Daniel Stevens <dstevens@atlassian.com>
Date: Fri Sep 30 15:50:58 2016 -0700
repeated quote to show how a change moves through the process
Ce que vous pouvez voir, c'est que chaque message de commit comporte quatre éléments :
Élément | Description |
---|---|
Empreinte de commit | Description Une chaîne alphanumérique (codée avec SHA-1) qui identifie un changement spécifique |
Auteur | Description La personne qui a commité le changement |
Date | Description La date à laquelle le changement a été commité dans le projet |
Message de commit | Description Une chaîne de texte qui décrit le ou les changements. Bonne pratique : écrivez de courts messages descriptifs de commit, et vous contribuerez à créer un dépôt de travail plus harmonieux pour tous. |
Trouver un commit spécifique
Il est très probable que le changement que vous souhaitez annuler remonte à un certain temps dans l'historique du projet, et ce dernier peut-être volumineux. Nous allons donc vous montrer quelques opérations de base utilisant git log
pour trouver un changement spécifique.
1. Accédez à votre fenêtre de terminal et naviguez jusqu'au niveau supérieur de votre dépôt local en utilisant la commande cd
(changer de répertoire).
$ cd ~/repos/tutorial-documentation-tests/
Saisissez la commande git log --oneline
. Ajouter --oneline
affichera chaque commit sur une seule ligne, ce qui vous permet de voir plus d'historique sur votre terminal.
Appuyez sur la touche q pour quitter le journal de commit et revenir à votre invite de commande à tout moment.
Vous devriez voir quelque chose comme ça :
$ git log --oneline
1f08a70 (HEAD -> main, origin/main, origin/HEAD) Initial Bitbucket Pipelines configuration
52f823c repeated quote to show how a change moves through the process
4801b87 Merged in changes (pull request #6)
1a6a403 myquote edited online with Bitbucket
3b29606 (origin/changes) myquote2.html edited online with Bitbucket
8b236d9 myquote edited online with Bitbucket
235b9a7 testing prs
c5826da more changes
...
2. Appuyez sur la touche q pour revenir à votre invite de commande à tout moment.
3. Trouvez le commit portant l'empreinte c5826da
et more changes dans la liste générée par la commande git log
. Quelqu'un n'a pas écrit de message de commit descriptif, nous devrons donc déterminer si ce message contient les changements dont nous avons besoin.
4. Mettez en surbrillance l'empreinte du commit c5826da
et copiez-la depuis la sortie de git log
dans votre fenêtre de terminal.
5. Saisissez git show
, puis collez ou transcrivez l'empreinte de commit copiée et appuyez sur Entrée. Vous devriez voir un résultat similaire à celui-ci :
$git show c5826daeb6ee3fd89e63ce35fc9f3594fe243605
commit c5826daeb6ee3fd89e63ce35fc9f3594fe243605
Author: Daniel Stevens <dstevens@atlassian.com>
Date: Tue Sep 8 13:50:23 2015 -0700
more changes
diff --git a/README.md b/README.md
index bdaee88..6bb2629 100644
--- a/README.md
+++ b/README.md
@@ -11,12 +11,7 @@ This README would normally document whatever steps are necessary to get your app
### How do I get set up? ###
* Summary of set up
-* Configuration
-* Dependencies
-* Database configuration
-* How to run tests
-* Deployment instructions
-* more stuff and things
:
L'invite en bas continue à se remplir jusqu'à indiquer le changement complet. Appuyez sur q pour quitter votre invite de commande.
Filtrer git log pour trouver un commit spécifique
Ce filtre | Résultat | Cet exemple de commande | Se traduit par |
---|---|---|---|
| Résultat Limite le nombre de commits affichés | Cet exemple de commande | Se traduit par Les 10 commits les plus récents dans l'historique |
| Résultat Limite les commits affichés à la période associéeVous pouvez également utiliser | Cet exemple de commande | Se traduit par Tous les commits postérieurs au 4 juillet 2017 |
| Résultat Liste tous les commits dont l'auteur correspond à la valeur « nom » | Cet exemple de commande | Se traduit par Tous les commits réalisés par un auteur portant le nom d'Alana |
| Résultat Renvoie tous les commits contenant un message de commit correspondant à la chaîne indiquée | Cet exemple de commande | Se traduit par Tous les commits contenant HOT- comme chaîne de texte dans leur message |
C'était un bref coup de projecteur sur la commande git log
. Si vous aimez utiliser cette commande, vous apprécierez sans doute le tutoriel avancé sur git log.
Annuler un changement grâce à git reset
Pour commencer, annulons simplement le dernier commit dans l'historique. Le cas échéant, disons que vous venez d'activer des pipelines de solution de CI/CD Bitbucket, mais vous réalisez que le script n'est pas adapté.
1. Saisissez git log --oneline
dans votre fenêtre de terminal.
2. Copiez l'empreinte de commit pour le second commit dans log: 52f823c
, puis appuyez sur q pour quitter le journal.
3. Saisissez git reset --soft 52f823c
dans votre fenêtre de terminal. En cas de réussite, la commande devrait s'exécuter en arrière-plan. Et voilà, vous venez d'annuler votre premier changement. Voyons maintenant le résultat de cette action.
4. Saisissez git status
dans votre fenêtre de terminal, et vous verrez que le commit a été annulé et qu'il apparaît maintenant comme un changement non commité. Le résultat devrait ressembler à ce qui suit :
$ git status
On branch main
Your branch is behind 'origin/main' by 1 commit, and can be fast-forwarded.
(use "git pull" to update your local branch)
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: bitbucket-pipelines.yml
5. Saisissez git log --oneline
dans votre fenêtre de terminal. Vous devriez voir un résultat similaire à celui-ci :
$ git log --oneline
52f823c repeated quote to show how a change moves through the process
4801b87 Merged in changes (pull request #6)
1a6a403 myquote edited online with Bitbucket
3b29606 (origin/changes) myquote2.html edited online with Bitbucket
8b236d9 myquote edited online with Bitbucket
235b9a7 testing prs
c5826da more changes
43a87f4 remivng
d5c4c62 a few small changes
23a7476 Merged in new-feature2 (pull request #3)
5cc4e1e add a commit message
cbbb5d6 trying a thing
438f956 adding section for permissions and cleaning up some formatting
23251c1 updated snipptes.xml organization into resources. other files misc changes
3f630f8 Adding file to track changes
6. Vous pouvez voir que la nouvelle réf HEAD
de la branche est le commit 52f823c
, exactement ce que vous vouliez.
7. Appuyez sur q pour quitter le journal. Laissez votre terminal ouvert, car maintenant que vous avez appris à exécuter une simple commande reset, nous allons essayer quelque chose d'un petit peu plus complexe.
Annuler plusieurs changements grâce à git reset
Pour commencer, annulons simplement le dernier commit dans l'historique. Le cas échéant, disons que vous venez d'activer des pipelines de solution de CI/CD Bitbucket, mais vous réalisez que le script n'est pas adapté.
1. Saisissez git log --online
2. Copiez l'empreinte du commit 1a6a403
(myquote édité en ligne avec Bitbucket), le commit juste sous la pull request 6, qui contient les changements que nous voulons annuler.
3. Saisissez git reset 1a6a403
dans votre fenêtre de terminal. La sortie devrait ressembler à ce qui suit :
$ git reset 1a6a403
Unstaged changes after reset:
M README.md
M myquote2.html
Vous pouvez voir que les changements sont maintenant à un état non commité. Cela signifie que nous avons maintenant supprimé plusieurs changements à la fois de l'historique du projet et de la zone de staging.
4. Saisissez git status
dans votre fenêtre de terminal. La sortie devrait ressembler à ce qui suit :
$ git status
On branch main
Your branch is behind 'origin/main' by 6 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: README.md
modified: myquote2.html
Untracked files:
(use "git add <file>..." to include in what will be committed)
bitbucket-pipelines.yml
no changes added to commit (use "git add" and/or "git commit -a")
À présent, vous pouvez voir que le premier changement que nous avons annulé (le fichier bitbucket-pipelines.yml
) n'est plus suivi par Git
. En effet, l'appel de la commande git reset
supprime le changement de la réf HEAD de la branche et de la zone de suivi ou d'indexation de Git
. Le processus sous-jacent est un peu plus complexe que ce que nous pouvons couvrir ici, vous pourrez en découvrir plus dans git reset
.
5. Saisissez git log --oneline
dans votre fenêtre de terminal.
1a6a403 myquote edited online with Bitbucket
8b236d9 myquote edited online with Bitbucket
43a87f4 remivng
d5c4c62 a few small changes
23a7476 Merged in new-feature2 (pull request #3)
5cc4e1e add a commit message
cbbb5d6 trying a thing
438f956 adding section for permissions and cleaning up some formatting
23251c1 updated snipptes.xml organization into resources. other files misc changes
3f630f8 Adding file to track changes
e52470d README.md edited online with Bitbucket
e2fad94 README.md edited online with Bitbucket
592f84f Merge branch 'main' into new-feature2 Merge branch especially if it merges an updated upstream into a topic branch.
7d0bab8 added a line
879f965 adding to the quote file
8994332 Merged in HOT-235 (pull request #2)
b4a0b43 removed sarcastic remarks because they violate policy.
b5f5199 myquote2.html created online with Bitbucket
b851618 adding my first file
5b43509 writing and using tests
La sortie du journal montre maintenant que l'historique du commit a également été modifié et démarre au commit 1a6a403. À des fins d'illustration et pour donner un exemple supplémentaire, disons que nous voulons maintenant annuler le reset que nous venons de faire. Après mûre réflexion, nous voulions peut-être conserver le contenu de la pull request 6.
Faire un push de resets dans Bitbucket
La commande git reset
est l'une des rares méthodes d'« annulation » proposées par Git
. Les resets sont généralement considérés comme une option « peu sûre » pour annuler les changements. Ils sont acceptables lorsque l'on travaille en local, dans un code isolé, mais deviennent dangereux lorsqu'ils sont partagés avec les membres de l'équipe.
Pour partager une branche qui a été réinitialisée auprès d'une équipe distante, il faut effectuer un « push forcé ». Un « push forcé » est initié par l'exécution de la commande git push -f
. Un « push forcé » détruit tout l'historique développé sur la branche après le push.
Voici un exemple de ce scénario « dangereux » :
- Le développeur A développe une nouvelle fonctionnalité sur une branche.
- Le développeur B développe une fonctionnalité distincte sur la même branche.
- Le développeur B décide de réinitialiser la branche à un état antérieur au début du travail des développeurs A et B.
- Le développeur B fait alors un push forcé de la branche reset vers le dépôt distant.
- Le développeur A fait un pull de la branche pour obtenir les mises à jour. Pendant ce pull, le développeur A reçoit la mise à jour forcée. Cela réinitialise la branche locale du développeur A à un état précédent tout travail sur les fonctionnalités et lui fait perdre ses commits.
Annuler une commande git reset
Jusqu'à présent, nous avons transmis des empreintes SHA de git commit
à git reset
. Il manque désormais des commits (qui ont été réinitialisés) dans la sortie de git log
. Comment allons-nous récupérer ces commits ? Git ne supprime jamais complètement un commit, à moins qu'il ne soit détaché de tous ses pointeurs. De plus, Git
stocke un journal distinct de tous les mouvements de réfs, le « reflog ». Nous pouvons consulter le reflog en exécutant la commande git reflog
.
1a6a403 HEAD@{0}: reset: moving to 1a6a403
1f08a70 HEAD@{1}: reset: moving to origin/main
1f08a70 HEAD@{2}: clone: from git@bitbucket.org:dans9190/tutorial-documentation-tests.git
La sortie de git reflog
devrait être similaire à ce qui précède. Vous pouvez voir l'historique des actions dans le dépôt. La ligne du haut fait référence au reset que nous avons effectué pour réinitialiser la pull request 6. Réinitialisons maintenant le reset pour rétablir la pull request 6. La deuxième colonne de cette sortie de reflog indique un pointeur de réf vers un changement effectué dans le dépôt. Ici, HEAD@{0}
est une référence à la commande reset que nous avons exécutée précédemment. Nous ne voulons pas donner suite à cette commande reset, nous allons donc restaurer le dépôt à la réf HEAD@{1}
.
$ git reset --hard HEAD@{1}
HEAD is now at 1f08a70 Initial Bitbucket Pipelines configuration
À présent, examinons l'historique de commit des dépôts en exécutant git log --oneline
:
$git log --online
1f08a70 Initial Bitbucket Pipelines configuration
52f823c repeated quote to show how a change moves through the process
4801b87 Merged in changes (pull request #6)
1a6a403 myquote edited online with Bitbucket
3b29606 myquote2.html edited online with Bitbucket
8b236d9 myquote edited online with Bitbucket
235b9a7 testing prs
c5826da more changes
43a87f4 remivng
d5c4c62 a few small changes
23a7476 Merged in new-feature2 (pull request #3)
5cc4e1e add a commit message
cbbb5d6 trying a thing
438f956 adding section for permissions and cleaning up some formatting
23251c1 updated snipptes.xml organization into resources. other files misc changes
3f630f8 Adding file to track changes
e52470d README.md edited online with Bitbucket
e2fad94 README.md edited online with Bitbucket
592f84f Merge branch 'main' into new-feature2 Merge branch especially if it merges an updated upstream into a topic branch.
7d0bab8 added a line
:
La sortie du journal montre maintenant que l'historique du commit a également été modifié et démarre au commit 1a6a403. À des fins d'illustration et pour donner un exemple supplémentaire, disons que nous voulons maintenant annuler le reset que nous venons de faire. Après mûre réflexion, nous voulions peut-être conserver le contenu de la pull request 6.
Git revert
Les exemples précédents présentaient d'importantes opérations d'annulation à l'aide des commandes git reset
et git reflog
. Git contient un autre utilitaire d'annulation qui est souvent considéré comme plus « sûr » que le reset. Le revert crée des commits qui contiennent l'inverse des changements introduits par les commits spécifiés. Ces commits de revert peuvent ensuite être pushés en toute sécurité vers des dépôts distants pour être partagés avec d'autres développeurs.
La section suivante illustrera l'utilisation de git revert
. Poursuivons avec l'exemple de la section précédente. Pour commencer, examinons le journal et trouvons un commit à restaurer.
$ git log --online
1f08a70 Initial Bitbucket Pipelines configuration
52f823c repeated quote to show how a change moves through the process
4801b87 Merged in changes (pull request #6)
1a6a403 myquote edited online with Bitbucket
1f08a70 Initial Bitbucket Pipelines configuration
52f823c repeated quote to show how a change moves through the process
4801b87 Merged in changes (pull request #6)
1a6a403 myquote edited online with Bitbucket
3b29606 myquote2.html edited online with Bitbucket
8b236d9 myquote edited online with Bitbucket
235b9a7 testing prs
c5826da more changes
43a87f4 remivng
d5c4c62 a few small changes
23a7476 Merged in new-feature2 (pull request #3)
5cc4e1e add a commit message
cbbb5d6 trying a thing
438f956 adding section for permissions and cleaning up some formatting
23251c1 updated snipptes.xml organization into resources. other files misc changes
3f630f8 Adding file to track changes
e52470d README.md edited online with Bitbucket
e2fad94 README.md edited online with Bitbucket
592f84f Merge branch 'main' into new-feature2 Merge branch especially if it merges an updated upstream into a topic branch.
7d0bab8 added a line
:
Pour cet exemple, choisissons le commit le plus récent, 1f08a70
. Pour ce scénario, disons que nous voulons annuler les éditions apportées dans ce commit. Exécutez :
$ git revert 1f08a70
Cela va lancer un workflow git merge
. Git crée alors un commit dont le contenu est l'inverse de celui qui a été spécifié pour le revert. Git ouvre ensuite un éditeur de texte configuré pour demander un nouveau message de commit. Les reverts sont considérés comme l'option d'annulation la plus sûre en raison de ce workflow de commit. La création de commits de revert laisse une trace claire dans l'historique du commit du moment où une opération d'annulation a été exécutée.
Vous venez d'apprendre à annuler des changements !
Félicitations, vous avez terminé ! Revenez à ce tutoriel à tout moment ou rendez-vous dans la section « Annuler des changements » pour approfondir vos connaissances. Bonne continuation dans Bitbucket !
Partager cet article
Thème suivant
Lectures recommandées
Ajoutez ces ressources à vos favoris pour en savoir plus sur les types d'équipes DevOps, ou pour les mises à jour continues de DevOps chez Atlassian.