lab 17 Enlever des commits d’une branche

Buts

La commande revert de la section précédente est une commande puissante qui nous laisse défaire les effets de d’importe quel commit dans le dépôt. Cependant, à la fois le commit original et celui qui l’annule sont visibles dans l’historique de la branche (en utilisant la commande git log).

Souvent, nous faisons un commit et réalisons immédiatement que nous avons commis une erreur. Il pourrait être pratique d’avoir une commande de retour en arrière qui nous permette de faire comme si le mauvais commit n’avait jamais existé. Cette commande de retour en arrière devrait aussi pouvoir prévenir que le mauvais commit apparaisse dans l’historique de la commande git log. Ce serait comme si le mauvais commit n’avait jamais existé.

La commande reset 01

Nous avons déjà vu la commande reset et l’avons utilisé pour garder les fichiers en attente consistants avec un commit donné (nous avons utilisé le commit HEAD dans la précédente partie).

Quand nous donnons la référence d’un commit (comme un hash, une branche ou nom de tag), la commande reset va …

  1. Réécrire la branche courante jusqu’au point du commit spécifié
  2. De manière optionnelle, réinitialiser la liste des fichiers en attente pour
    correspondre au commit spécifié
  3. De manière optionnelle, réinitialiser le répertoire de travail pour
    correspondre au commit spécifié

Vérifions notre historique 02

Faisons une petite vérification de de notre historique de commit.

Execute:

git hist

Output:

$ git hist
* 412434e 2014-02-21 | Revert "Oups, nous  ne voulions pas ce commit" (HEAD, master) [Jim Weirich]
* 83f893e 2014-02-21 | Oups, nous  ne voulions pas ce commit [Jim Weirich]
* a9c6007 2014-02-21 | Ajout d'un commentaire (v1) [Jim Weirich]
* 221243e 2014-02-21 | Ajouter une valeur par défaut (v1-beta) [Jim Weirich]
* 80fc666 2014-02-21 | Using ARGV [Jim Weirich]
* 834ca4f 2014-02-21 | Mon premier commit [Jim Weirich]

Nous voyons que nous avons un commit “Oups” et un commit “Annuler Oups” comme deux derniers commits fait dans cette branche. Maintenant enlevons-les en utilisant reset.

En premier, marquer cette branche 03

mais avant d’enlever les commits, marquons le dernier commit avec un tag pour que nous puissions encore le retrouver.

Execute:

git tag oups

Réinitialiser à Avant Oups 04

En regardant l’historique de log (au dessus), nous voyions que le commit taggé ‘v1’ est le commit juste avant le mauvais commit. Commençons par réinitialiser la branche à ce point. A présent que cette branche est taggé, nous pouvons utiliser le nom du tag dans la commande reset (si elle ne l’était pas, nous pourrions juste utiliser la valeur de hash).

Execute:

git reset --hard v1
git hist

Output:

$ git reset --hard v1
HEAD is now at a9c6007 Ajout d'un commentaire
$ git hist
* a9c6007 2014-02-21 | Ajout d'un commentaire (HEAD, v1, master) [Jim Weirich]
* 221243e 2014-02-21 | Ajouter une valeur par défaut (v1-beta) [Jim Weirich]
* 80fc666 2014-02-21 | Using ARGV [Jim Weirich]
* 834ca4f 2014-02-21 | Mon premier commit [Jim Weirich]

Notre branche master branch pointe maintenant vers le commit v1 et le commit Oups et le commit Annuler Oups nes ont plus dans la branche. Le paramètre --hard indique que le répertoire de travail devrait être mis à jour pour être consistant avec le head de la nouvelle branche.

Rien n’est jamais perdu 05

Mais qu’est il arrivé aux mauvais commits? En fait les commits sont toujours dans le dépôt. D’ailleurs, nous pouvons toujours les référencer. Rappelez vous qu’au début de cette partie, nous avons taggé le commit d’annulation avec le tag “oups”. Regardons tous les commits.

Execute:

git hist --all

Output:

$ git hist --all
* 412434e 2014-02-21 | Revert "Oups, nous  ne voulions pas ce commit" (oups) [Jim Weirich]
* 83f893e 2014-02-21 | Oups, nous  ne voulions pas ce commit [Jim Weirich]
* a9c6007 2014-02-21 | Ajout d'un commentaire (HEAD, v1, master) [Jim Weirich]
* 221243e 2014-02-21 | Ajouter une valeur par défaut (v1-beta) [Jim Weirich]
* 80fc666 2014-02-21 | Using ARGV [Jim Weirich]
* 834ca4f 2014-02-21 | Mon premier commit [Jim Weirich]

Ici nous voyons que les mauvais commits n’ont pas disparus. Ils sont toujours dans le dépôt. C’est juste qu’ils ne sont plus listés dans la branche master. Si nous ne les avions pas taggés, ils seraient toujours dans le dépôt, mais il n’y aurait plus moyen de les référencer autrement que par leur nom de hash. Les commits non référencés restent dans le dépôt jusqu’à ce que le système lance l’utilitaire de nettoyage mémoire.

Les dangers du reset 06

Les réinitialisations sur les branches locales sont généralement sûres. N’importe quel accident peut être généralement récupéré en faisant un reset avec le commit désiré.

Cependant, si la branche est partagée sur des répertoires distants, faire un reset peut gêner les autres utilisateurs de la branche.

Table des matières