j’ai déjà parlé de la façon dont l’histoire d’une base de code est aussi importante que la base de code elle-même. Rebase est l’outil qui peut avoir le plus grand impact pour y parvenir. Une connaissance préalable des concepts fondamentaux du contrôle de source est cruciale pour comprendre ce poste.,
Rappelez-vous, même si vous pouvez utiliser git Rebase pour la suite (et peut-être plus) des cas, il reste les meilleures pratiques pour s’engager tôt et le plus souvent:
- Modifier/retravailler un commit dans l’histoire
- Ajouter un commit dans l’histoire d’un changement (ou de la branche)
- Supprimer une validation à partir de l’histoire d’un changement (ou de la branche)
- Split a s’engager dans plusieurs commits
- Combiner une série de commits dans un commit
- Re-commande l’engagent
Ce que Cela signifie?,
git-git rebase – Réappliquer s’engage sur une autre base astuce
git-git rebase
Si vous remplacez le mot « base » avec « ancêtre », c’est la même chose, en d’autres mots:
Donner un nouvel ancêtre à une validation ou une séquence de commits.
‘base’ est utilisé dans la documentation pour permettre à la base de signifier une branche, un commit, une balise ou toute autre chose pouvant être référencée dans git.,
comme indiqué précédemment, un commit contient – entre autres – l’id de son(ses) commit (s) parent (s). En tant que tel, Rebase met effectivement à jour le commit parent pour l’ensemble de commits que vous fournissez.
il est également important de se rappeler que chaque commit dans Git est immuable, même pour rebaser. En tant que tel, Rebase recréera chaque commit, les enchaînant tous ensemble mais avec le nouvel ancêtre.
Rebase est un peu comme L’Almanach sportif Grays: il peut tout changer!
De tenor.com
Les règles!,
lorsque vous utilisez Rebase, vous devez respecter certaines règles – sinon un monde de douleur peut s’ensuivre.
- ne Rebase jamais une branche publique – celle que d’autres personnes utilisent
rappelez – vous que Rebase doit suivre les règles d’un commit-qu’il est immuable. En tant que tel un nouveau commit sera créé pour chaque étape du processus. Cela signifie que vous’ tirez le tapis sous les pieds ‘de toute personne utilisant le’ vieux ‘ commit.,
Git verra que le commit existe deux fois – la première version et la version Rebasée – et sera potentiellement confus lorsque vous essayez de fusionner les modifications ensemble. De plus, l’historique montrera le commit deux fois, bien qu’avec des identifiants différents. Un peu comme avoir deux Marty dans la même chronologie-déroutant!
pour en savoir plus:
- règles de rebasage
que faire si ça va mal
Comme avec Retour vers le futur, il y a toujours un moyen de sortir de tout problème qui peut faire surface., Lorsque Rebase crée de nouveaux commits, la branche peut être réinitialisée à l’ancien commit et vous êtes de retour là où vous étiez auparavant. Je suggère de toujours pousser votre branche vers remote avant d’utiliser Rebase, surtout si vous le connaissez moins. Cela ajoute simplement un autre niveau de sécurité au cas où vous en auriez besoin.
avant D’utiliser Rebase, notez où vous étiez – Quel est l’id de validation, ou le nom de la branche s’il n’a pas changé depuis remote.,
Si Rebase échoue en partie et que vous souhaitez annuler/abandonner et revenir à l’endroit où vous étiez auparavant, vous pouvez exécuter: git rebase --abort
Si votre branche a été poussée avant la main et que vous souhaitez réinitialiser à ce que la branche ressemble à distance: git reset --hard origin/<branch name>
git reset --hard <commit SHA>
chacune des commandes décrites ci-dessus réinitialisera votre branche actuelle à l’endroit où vous étiez avant de commencer l’activité de rebase.,
lecture ultérieure:
- git-rebase
rebase interactif
Rebase peut être utilisé dans l’un des deux modes différents, interactif et non interactif. Ils font tous les deux la même chose, mais l’édition interactive permet de manipuler le processus.
Nous avons donc décrit Rebase comme un outil qui peut fournir un nouvel ancêtre à un ensemble de commits. Rebase créera un ‘ script ‘(un peu comme une liste de tâches) dont les commits seront affectés. La version non interactive de Rebase produit ce script puis l’exécute immédiatement.,
la version interactive permet de modifier ce script avant son exécution.
le script est simplement un ensemble ordonné de commandes à exécuter. C’est un fichier texte qui contient chaque ID de validation et ce qu’il faut faire avec. Le message pour chaque commit est inclus pour plus de clarté.
Un exemple Rebase interactif script ressemble:
pick 509de5ac New post - Building performant large scale web applications (#1344)pick 449486aa Source control - when blog post (#1345)pick 3d4e82be Add fundamentals blog post
ci-dessus, pick
signifie ajouter la validation donnée comme un enfant sur la précédente livraison. Donc, l’histoire, à partir de la base donnée ressemblera exactement à celle fournie ci-dessus., Le script fonctionne de haut en bas, donc le commit en bas sera le dernier commit ajouté à la branche.
Vous pouvez choisir différentes commandes au lieu depick
, elles sont:
dans de nombreux cas, vous pouvez provoquer des conflits de fusion au fur et à mesure que le Rebase progresse dans son script. Ceci est normal et rien de s’inquiéter. Vous aurez juste à résoudre les conflits avant de poursuivre. Si tel est le cas, utilisez git mergetool
pour résoudre les conflits. Une fois qu’ils sont tous résolus, utilisez git rebase --continue
pour contenir le processus., Bien sûr, si vous voulez interrompre le processus de Rebase, utilisez git rebase --abort
.
Il convient de noter que Rebase est assez intelligent pour ne créer de nouveaux commits que s’il sait que quelque chose a changé. Si le parent d’un commit est le même qu’avant, il gardera le commit tel quel et continuera jusqu’à ce qu’il ait du travail à faire. Voici quelques exemples pour démontrer les utilisations de Rebase à diverses fins. Tous présumer que la « base » a changé, et en tant que tel Rebase a du travail à faire à chaque étape du processus.,
modifier/retravailler un commit dans l’historique
considérez le scénario où vous devez corriger une faute de frappe dans un fichier. Vous souhaitez modifier le commit afin que le commit soit propre et approprié – vous ne voulez pas avoir un autre commit qui corrige la faute de frappe plus tard.,= »5779374de0″>
449486aa
3d4e82be
, l’établissement de ses parents pour le nouvel id 449486aa
À l’étape 4, vous pouvez faire les changements dont vous avez besoin et de les modifier s’engager, par exemple:
- Modifier le fichier
- Stade le fichier (
git add <file>
- envoyer le fichier, modification de la commettre (
git commit --amend
Lorsque vous avez terminé le modifie, vous devez exécuter git rebase --continue
pour passer à l’étape 5 et terminer le processus.,
correction d’une faute de frappe dans un message de validation
la commandereword
est la même que la commandeedit
– sauf qu’elle invite uniquement à modifier le message plutôt que le contenu de la validation, par exemple:
pick 509de5ac New post - Building performant large scale web applications (#1344)reword 449486aa Source control - when blog post (#1345)pick 3d4e82be Add fundamentals blog post
ne pas oublier, changer le message dans le script ne change pas le contenu du message de validation. Enregistrez et fermez le script et attendez que Rebase rouvre l’éditeur de messages pour le/les commit (s) choisi (s).,
Ajouter un commit dans l’historique d’un jeu de modifications (ou d’une branche)
considérez le scénario où vous devez apporter une modification supplémentaire à la base de code après un commit. Vous avez oublié de le faire et vous voulez vous assurer qu’il est au bon endroit dans l’historique – juste après le commit approprié., 509de5ac
3d4e82be
, en définissant son parent sur le nouvel id pour le nouveau commit que vous avez crééAu Lieu de modifier 449486aa
peut ajouter un nouveau commit à la place, par exemple:
- Make the change/s
- stage the file/s (
git add <file>
) - commit the change/s (
git commit
)
lorsque vous avez terminé les modifications, vous devez exécuter git rebase --continue
pour passer à l’étape 5 et terminer le processus., À la fin du processus, vous aurez 4 commits dans l’historique plutôt que 3.
supprimer un commit de l’historique d’un ensemble de modifications (ou d’une branche)
considérez le scénario dans lequel vous avez commis une modification que vous ne souhaitez pas conserver et souhaitez la supprimer de l’historique. Peut-être avez-vous commis une modification temporaire que vous souhaitez éjecter de la branche avant qu’elle ne soit fusionnée.,
Vous pouvez modifier le script afin qu’il montre quelque chose comme:
pick 509de5ac New post - Building performant large scale web applications (#1344)pick 3d4e82be Add fundamentals blog post
Notez que la ligne 2 (449486aa
) a été supprimée, de sorte qu’il ne sera pas inclus dans le processus.,
Lorsque vous enregistrez puis fermez le fichier, Rebase sera:
- Réinitialiser la direction générale de la base
- Ajouter commit
509de5ac
, le réglage de son parent à la donnée de base - Ajouter commit
3d4e82be
, l’établissement de ses parents pour le nouvel id509de5ac
À la fin du processus, vous aurez 2 s’engage dans l’histoire au lieu de 3.
diviser un commit en plusieurs commits
considérez le scénario où vous avez accidentellement commis deux modifications dans le même commit., Vous voulez les diviser pour que l’historique soit soigné; de sorte que si nécessaire à l’avenir, une partie du commit puisse être rétablie sans tout rétablir., »>
lorsque vous enregistrez puis fermez le fichier, Rebase:
- réinitialiser la branche à la base
- ajouter commit
509de5ac
, en définissant son parent à la base donnée - ajouter commit
449486aa
, en définissant son parent à la ID pour509de5ac
- attendez que vous éditiez/modifiez ce commit
- ajouter commit
3d4e82be
, en définissant son parent sur le nouvel ID pour le dernier commit que vous avez ajouté au cours de l’étape 4
au lieu de modifier le commit, vous le réinitialisez, annulant,vous pouvez donc exécuter git reset HEAD~1
. Cela supprimera le commit et placera toutes les modifications dans votre copie de travail. À partir de là que vous pouvez choisir d’ajouter les fichiers dans l’individu s’engage, c’est à dire
-
git add <file1>
puisgit commit -m <message 1>
-
git add <file2>
puisgit commit -m <message 2>
Lorsque vous avez fini de l’amende dont vous avez besoin, l’exécution git rebase --continue
pour passer à l’étape 5 et terminer le processus. À la fin du processus, vous aurez 5 (ou plus) commits dans l’historique plutôt que 3.,
combinez une série de commits en un seul commit
considérez le scénario, vous avez fait quelques commits et ils doivent être fusionnés: ils n’ont pas de sens seuls ou pour une autre raison.,p>Vous pouvez modifier le script pour qu’il affiche quelque chose comme suit:
pick 509de5ac New post - Building performant large scale web applications (#1344)pick 449486aa Source control - when blog post (#1345)squash 3d4e82be Add fundamentals blog post
lorsque vous enregistrez puis fermez le fichier, Rebase:
- réinitialiser la branche à la base
- ajouter commit
509de5ac
, en définissant son parent à la base donnée - ajouter commit un commit contient les modifications de
449486aa
et3d4e82be
, en définissant son parent sur le nouvel ID pour509de5ac
- rebase mettra en pause et demandera un message, qui est préparé comme une combinaison des deux.,E. » Source control-when blog post (#1345) Add fundamentals blog post”
- Si vous voulez prendre le message du premier commit tel quel, utilisez la commande
fixup
au lieu desquash
.
Vous pouvez squash
ou fixup
comme de nombreux engage que vous le souhaitez – il n’est pas limité à 2 s’engage à la fois. Lorsque L’éditeur de messages est enregistré et fermé (si vous utilisez squash
), Rebase continuera jusqu’à la fin du script., À la fin du processus, vous aurez 2 commits dans l’historique plutôt que 3. Le dernier commit aura le message que vous avez entré dans l’éditeur de messages lors de l’étape 3. Git sera par défaut concaténer les messages ensemble, lorsque vous utilisez squash
et utiliser le premier message lorsque vous utilisez fixup
.
réorganiser les commits
considérez le scénario, vous avez apporté quelques modifications mais elles ont plus de sens si elles sont dans un ordre différent.,
Vous pouvez modifier le script afin qu’il montre quelque chose comme:
pick 449486aa Source control - when blog post (#1345)pick 3d4e82be Add fundamentals blog postpick 509de5ac New post - Building performant large scale web applications (#1344)
Notez que la ligne 1 a été déplacé à la ligne 3., Lorsque vous enregistrez puis fermez le fichier, Rebase sera:
- Réinitialiser la direction générale de la base
- Ajouter commit
449486aa
, le réglage de son parent à la donnée de base - Ajouter commit
3d4e82be
, l’établissement de ses parents pour le nouvel id449486aa
- Ajouter commit
509de5ac
, le réglage de sa mère pour le nouvel id3d4e82be
À la fin du processus, vous aurez la même commet, juste dans un ordre différent.,
pas de travail à faire
j’ai mentionné ci – dessus que Rebase est assez intelligent pour ne pas créer de nouveaux commits là où il n’en a pas besoin-c’est quand la base / parent est la même qu’avant., C’est ce qui arrive si vous n’avez pas de modifier le script initial, donc c’est toujours comme ça quand vous fermez l’éditeur:
pick 509de5ac New post - Building performant large scale web applications (#1344)pick 449486aa Source control - when blog post (#1345)pick 3d4e82be Add fundamentals blog post
- Réinitialiser la branche à la base, qui est le même que le parent de
509de5ac
- Ajouter commit
509de5ac
, le parent est le même, Pas d’autres changements sont nécessaires pour la validation peut être utilisé en tant que-est - Ajouter commit
449486aa
, le parent est le même:509de5ac
., Pas d’autres changements sont nécessaires pour la validation peut être utilisé en tant que-est - Ajouter commit
3d4e82be
, le parent est le même:449486aa
. Aucune autre modification n’est nécessaire pour que le commit puisse être utilisé tel quel
à la fin du processus, rien n’aura changé sur la branche – tous les commits existeront toujours et dans le même ordre. En vérité, Rebase est encore plus intelligent que cela, mais j’utilise cette simplification pour démontrer que Rebase ne recréera que les commits quand il le faut.,
pour en savoir plus
- git rebase
- règles de rebasage
Laisser un commentaire