Git

Comment écraser les commits Git

Comment écraser les commits Git

Comment écraser les commits dans Git pour garder votre historique propre

Lorsque vous travaillez avec Git, c'est une bonne idée de commiter souvent, vous pouvez donc toujours revenir à l'état du code si vous vous trompez. Cependant, engager tous ces mini-changements dans la branche principale n'est pas toujours une bonne idée. Cela rend l'histoire désordonnée et difficile à suivre.

Git fournit un moyen d'écraser un tas de vos commits à l'aide de la commande rebase. Une fois que vous avez apporté localement vos modifications à un fichier particulier ou pour une fonctionnalité particulière, vous pouvez toujours utiliser la méthode squash pour combiner les modifications avant de vous engager dans la branche principale. Cela aidera les autres à mieux comprendre vos changements.

Avertissement : Même si vous pouvez extraire des référentiels externes et des commits squash ensemble, c'est une mauvaise idée. Cela peut créer des conflits et de la confusion. Évitez de modifier l'historique qui est déjà public. Ne s'en tenir qu'à l'écrasement des commits locaux à votre travail.

Travaillons à travers un cas d'exemple.

Supposons que nous ayons deux fichiers a.py et b.py. Commençons d'abord par le processus de création des fichiers et de modifications :

$ mkdir monprojet
$ cd monprojet/
$ git init
$ echo "print("bonjour A")" > a.py
$ git add -A && git commit -m "A ajouté un.py"
$ echo "print("bonjour B")" > b.py
$ git add -A && git commit -m "Ajouté b.py"
$ echo "print("bonjour BB")" > b.py
$ git add -A && git commit -m "b.py Modification 1"
$ echo "print("bonjour BBB")" > b.py
$ git add -A && git commit -m "b.py Modification 2"

Si nous vérifions l'historique des commits, nous verrons ce qui suit :

$ git log --oneline --graph --decorate
* dfc0295 (TÊTE -> maître) b.py Modification 2
* ce9e582b.py Modification 1
* 7a62538 Ajouté b.py
* 952244a Ajout d'un.py

Une fois notre travail terminé, nous décidons de mettre tous les changements dans le b.py en un seul commit pour plus de clarté. On compte qu'il y a 3 commits sur b.py de la tête. Nous lançons la commande suivante :

git rebase -i HEAD~3

L'option -i indique à Git d'utiliser le mode interactif.

Une fenêtre devrait apparaître dans votre éditeur de texte Git :

choisir 7a62538 Ajouté b.py
choisir ce9e582 b.py Modification 1
choisissez dfc0295 b.py Modification 2
 
# Rebase 952244a… dfc0295 sur 952244a (3 commande(s))
#
# Commandes :
# p, choisir = utiliser commit
# r, reformuler = utiliser commit, mais éditer le message de commit
# e, edit = utiliser commit, mais stop pour modification
# s, squash = utiliser le commit, mais fusionner avec le commit précédent
# f, fixup = like "squash", mais ignore le message de journal de ce commit
# x, exec = exécuter la commande (le reste de la ligne) en utilisant le shell
#
# Ces lignes peuvent être réordonnées ; ils sont exécutés de haut en bas.
#
# Si vous supprimez une ligne ici QUI COMMIT SERA PERDUE.
#
# Cependant, si vous supprimez tout, le rebase sera abandonné.
#
# Notez que les commits vides sont commentés
~

Les commits sont répertoriés chronologiquement en haut du plus ancien au plus récent. Vous pouvez choisir quel commit à "choisir" et quel commit à écraser. Pour plus de simplicité, nous allons choisir le premier commit et écraser le reste dedans. Nous allons donc modifier le texte comme ceci :

choisir 7a62538 Ajouté b.py
courge ce9e582 b.py Modification 1
courge dfc0295 b.py Modification 2
 
# Rebase 952244a… dfc0295 sur 952244a (3 commande(s))
#
# Commandes :
# p, choisir = utiliser commit
# r, reformuler = utiliser commit, mais éditer le message de commit
# e, edit = utiliser commit, mais stop pour modification
# s, squash = utiliser le commit, mais fusionner avec le commit précédent
# f, fixup = like "squash", mais ignore le message de journal de ce commit
# x, exec = exécuter la commande (le reste de la ligne) en utilisant le shell
#
# Ces lignes peuvent être réordonnées ; ils sont exécutés de haut en bas.
#
# Si vous supprimez une ligne ici QUI COMMIT SERA PERDUE.
#
# Cependant, si vous supprimez tout, le rebase sera abandonné.
#
# Notez que les commits vides sont commentés

Dès que vous enregistrez et fermez le fichier texte, une autre fenêtre de texte devrait apparaître qui ressemble à ceci :

# Ceci est une combinaison de 3 commits.
# Le premier message du commit est :
Ajouté b.py
 
# Ceci est le 2ème message de validation :
 
b.py Modification 1
 
# Ceci est le 3ème message de commit :
 
b.py Modification 2
 
# Veuillez saisir le message de validation pour vos modifications. Lignes de départ
# avec '#' sera ignoré et un message vide interrompt le commit.
#
# Date :      Ven 30 mars 21:09:43 2018 -0700
#
# rebase en cours ; sur 952244a
# Vous éditez actuellement un commit tout en rebasant la branche 'master' sur '952244a'.
#
# Modifications à valider :
#       nouveau fichier :   b.py
#

Enregistrez et fermez également ce fichier. Vous devriez voir quelque chose comme ceci :

$ git rebase -i HEAD~3
[TÊTE détachée 0798991] Ajouté b.py
Date : ven. 30 mars 21:09:43 2018 -0700
1 fichier modifié, 1 insertion (+)
créer le mode 100644b.py
Refs/heads/master rebasés et mis à jour avec succès.

Si vous vérifiez l'historique des commits maintenant :

$ git log --oneline --graph --decorate
* 0798991 (TÊTE -> maître) Ajouté b.py
* 952244a Ajout d'un.py

Tous les commits pour b.py ont été écrasés dans un commit. Vous pouvez vérifier en regardant le b.fichier py :

$ chat b.py
print("bonjour BBB")

Il a le contenu de la Modification 2.

Conclusion

Le rebase est une commande puissante. Cela peut vous aider à garder votre historique propre. Mais évitez de l'utiliser pour des commits déjà publics car cela peut provoquer des conflits et de la confusion. Utilisez-le uniquement pour votre propre référentiel local.

Une étude plus approfondie:

Le curseur saute ou se déplace de manière aléatoire lors de la saisie dans Windows 10
Si vous constatez que le curseur de votre souris saute ou se déplace tout seul, automatiquement, au hasard lors de la saisie sur un ordinateur portabl...
Comment inverser le sens de défilement de la souris et des pavés tactiles dans Windows 10
Souris et Pavé tactiles rendent non seulement l'informatique facile, mais plus efficace et moins chronophage. Nous ne pouvons pas imaginer une vie san...
Comment changer la taille, la couleur et le schéma du pointeur et du curseur de la souris sous Windows 10
Le pointeur et le curseur de la souris dans Windows 10 sont des aspects très importants du système d'exploitation. Cela peut également être dit pour d...