Comment écraser Git

Comment écraser Git

Comment écraser les engagements en git pour garder votre histoire propre

Lorsque vous travaillez avec Git, c'est une bonne idée de vous engager souvent, vous pouvez donc toujours revenir à l'état du code si vous vous trompez. Cependant, commettre toutes 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 en utilisant la commande Rebase. Une fois que vous avez localement apporté vos modifications à un fichier particulier ou pour une fonctionnalité particulière, vous pouvez toujours utiliser la méthode Squash pour combiner les modifications ensemble avant de vous engager dans la branche principale. Cela aidera les autres à mieux comprendre vos changements.

AVERTISSEMENT: Même si vous pouvez vous retirer des référentiels externes et les courges s'engagent ensemble, c'est une mauvaise idée. Cela peut créer des conflits et une confusion. Évitez de changer l'historique qui est déjà public. Tenez-vous uniquement aux commits d'écrase qui sont locaux à votre travail.

Travaillons un exemple de cas.

Supposons que nous ayons deux fichiers un.py et b.py. Passons d'abord par le processus de création des fichiers et de réaliser les modifications:

$ mkdir myproject
$ cd myproject /
$ git init
$ echo "print (" bonjour a ")"> a.py
$ git add -a && git commit -m "ajout un.py "
$ echo "print (" Hello B ")"> b.py
$ git add -a && git commit -m "ajouté b.py "
$ echo "print (" Hello bb ")"> b.py
$ git add -a && git commit -m "b.modification py 1 "
$ echo "print (" Hello bbb ")"> b.py
$ git add -a && git commit -m "b.modification py 2 "

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

$ git Log --neline --graph - Décorate
* dfc0295 (tête -> maître) b.modification py 2
* CE9E582 B.modification py 1
* 7a62538 ajouté b.py
* 952244a a ajouté un.py

Après avoir fini avec notre travail, nous décidons de mettre tous les modifications au B.py en un seul engagement pour plus de clarté. Nous comptons qu'il y a 3 engins sur b.Py de la tête. Nous émettez la commande suivante:

git repase -i tête ~ 3

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

Il devrait apparaître une fenêtre sur votre éditeur de texte git:

Choisir 7A62538 Ajouté B.py
choisir ce9e582 b.modification py 1
Choisissez DFC0295 B.modification py 2
# Rebase 952244A… DFC0295 sur 952244A (3 Commande (s))
#
# Commandes:
# p, pick = use commit
# r, reformulaire = utiliser commit, mais modifier le message de validation
# e, edit = use commit, mais arrêtez pour modifier
# s, squash = utiliser commit, mais se fondre dans un engagement précédent
# f, fixup = comme "squash", mais jetez le message du journal de cet engagement
# x, exec = run commande (le reste de la ligne) en utilisant le shell
#
# Ces lignes peuvent être réorganisé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, la rebase sera abandonnée.
#
# Notez que les commits vides sont commentés
~

Les commits sont répertoriés chronologiquement sur le dessus du plus tôt au plus récent. Vous pouvez choisir quel vous engager à «choisir» et qui s'engage à écraser. Pour plus de simplicité, nous choisirons le premier engagement et écraserons le reste. Nous allons donc modifier le texte comme ceci:

Choisir 7A62538 Ajouté B.py
Squash CE9E582 B.modification py 1
Squash DFC0295 B.modification py 2
# Rebase 952244A… DFC0295 sur 952244A (3 Commande (s))
#
# Commandes:
# p, pick = use commit
# r, reformulaire = utiliser commit, mais modifier le message de validation
# e, edit = use commit, mais arrêtez pour modifier
# s, squash = utiliser commit, mais se fondre dans un engagement précédent
# f, fixup = comme "squash", mais jetez le message du journal de cet engagement
# x, exec = run commande (le reste de la ligne) en utilisant le shell
#
# Ces lignes peuvent être réorganisé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, la rebase sera abandonnée.
#
# 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:

# C'est une combinaison de 3 commits.
# Le message du premier engagement est:
Ajout de b.py
# C'est le 2ème message de validation:
b.modification py 1
# C'est le 3ème message de validation:
b.modification py 2
# Veuillez saisir le message de validation pour vos modifications. Les lignes commençant
# avec '#' sera ignoré, et un message vide interdit le commit.
#
# Date: ven 30 mars 21:09:43 2018 -0700
#
# Rebase en cours; sur 952244A
# Vous modifiez actuellement un engagement en rebassant la succursale «Master» sur «952244a».
#
# Modifications à engager:
# nouveau fichier: b.py
#

Enregistrer et fermer ce fichier aussi. Vous devriez voir quelque chose comme ceci:

$ git rebase -i tête ~ 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 100644 b.py
Rebased avec succès et référentiel mis à jour / têtes / maître.

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

$ git Log --neline --graph - Décorate
* 0798991 (tête -> maître) ajouté b.py
* 952244a a ajouté un.py

Tous les commits pour b.py a été écrasé en un seul engagement. Vous pouvez vérifier en regardant le b.fichier py:

$ chat b.py
imprimer ("bonjour bbb")

Il a le contenu de la modification 2.

Conclusion

La Rebase est une commande puissante. Cela peut vous aider à garder votre histoire propre. Mais évitez de l'utiliser pour des engagements déjà publics car il peut provoquer des conflits et une confusion. Utilisez-le uniquement pour votre propre référentiel local.

Une étude plus approfondie:

  • https: // git-scm.com / docs / git-rebase
  • https: // git-scm.com / book / en / v2 / git-ranching-rebasing
  • https: // git-scm.com / book / en / v2 / git-tools-rewriteur-histoire