Git

Tutoriel Git Rebase

Tutoriel Git Rebase

Les débutants de Git sont mis en garde contre la commande rebase. Et à juste titre. Avec toutes les nouvelles choses à apprendre, les débutants ont probablement intérêt à maîtriser les concepts de base avant de se plonger dans les subtilités du rebasage. Cependant, si vous comprenez les bases de la fusion de branches, alors savoir comment rebaser peut vous aider à résoudre des énigmes de développement compliquées au bon moment.

Git Rebase : définitions

Selon la documentation git, la commande rebase réappliquera les commits au-dessus d'un autre conseil de base. Cette définition peut être un peu intimidante. Il est plus facile d'expliquer le rebase comme une procédure qui ajoute les modifications de la branche actuelle à la queue d'une autre branche. Passons en revue un exemple pour avoir une meilleure idée de ce qui se passe.

Exemple de rebasage de Git

Dans cet exemple, nous allons d'abord créer un cas de test avec les branches 'master' et 'feature'. Ensuite, nous ferons une fusion standard. Ensuite, nous allons recréer le scénario de test et effectuer un rebase et une fusion.

1. Création de branches principales et de fonctions

Voici le scénario que nous allons créer :

A - B - C (maître) \ E - F (fonctionnalité) 

Dans l'exemple ci-dessus, nous prenons le chemin suivant :

  1. Commit A : nous ajoutons un.txt dans la branche 'master'
  1. Commit B : on ajoute b.txt dans la branche 'master'
  1. A ce stade, nous créons la branche 'feature' ce qui signifie qu'elle aura un.txt et b.SMS
  1. Commit C : on ajoute c.txt dans la branche 'master'
  1. Nous allons à la branche « fonctionnalité »
  1. Commit E : nous modifions un.txt dans la branche 'fonctionnalité'
  1. Commit F : on modifie b.txt dans la branche 'fonctionnalité'

Vous pouvez créer un dossier et exécuter le code suivant dans le dossier pour créer la situation ci-dessus :

git init toucher un.txt git add -A git commit -m "Commit A : a ajouté un.txt" touche b.txt git add -A git commit -m "Commit B: ajouté b.txt" git branch fonctionnalité touch c.txt git add -A git commit -m "Commit C: ajouté c.txt" git status git checkout fonctionnalité echo aaa > a.txt git add -A git commit -m "Commit E: a modifié un.txt" echo bbb > b.txt git add -A git commit -m "Commit F: modifié b.SMS" 

2. Fusion simple

Utilisons la commande log pour vérifier les deux branches.

Résultats pour 'maître' :

$ git checkout master Basculé vers la branche 'master' $ git log --oneline 2bbde47 Commit C : ajout c.txt b430ab5 Commit B : ajouté b.txt 6f30e95 Commit A : ajout d'un.txt $ ls a.txtb.txt c.SMS 

Résultats pour « fonctionnalité » :

$ git checkout feature Basculé vers la branche 'feature' $ git log --oneline 0286690 Commit F : modifié b.txt 7c5c85e Commit E : modification d'un.txt b430ab5 Commit B : ajouté b.txt 6f30e95 Commit A : ajout d'un.txt $ ls a.txtb.SMS 

Remarquez comment la branche de fonctionnalité n'a pas Commit C

Maintenant, exécutons la fusion de la branche 'feature' avec la branche 'master'. Il vous sera demandé de saisir un commentaire. Dans le commentaire, ajoutez « Commit G : » au début pour faciliter le suivi.

$ git checkout master Basculement vers la branche 'master' $ git merge fonctionnalité Fusion effectuée par la stratégie 'recursive'. une.txt | 1 + b.txt | 1 + 2 fichiers modifiés, 2 insertions (+) 

Résultats pour 'maître' :

 $ git checkout master Déjà sur 'master' $ git log --oneline d086ff9 Commit G : Fusionner la branche 'feature' 0286690 Commit F : modifié b.txt 7c5c85e Commit E : modification d'un.txt 2bbde47 Commit C : ajouté c.txt b430ab5 Commit B : ajouté b.txt 6f30e95 Commit A : ajout d'un.txt $ ls a.txtb.txt c.SMS 

Résultats pour 'fonctionnalité' :

$ git checkout feature Basculé vers la branche 'feature' $ git log --oneline 0286690 Commit F: modifié b.txt 7c5c85e Commit E : modification d'un.txt b430ab5 Commit B : ajouté b.txt 6f30e95 Commit A : ajout d'un.txt $ ls a.txtb.SMS 

Dans la branche 'master', vous remarquerez qu'il y a un nouveau commit G qui a fusionné les changements de la branche 'feature'. Fondamentalement, l'action suivante a eu lieu :

A - B - C  - G (maître) \   / E - F (fonctionnalité) 

Dans le commit G, toutes les modifications de la branche 'feature' ont été transférées dans la branche master. Mais la branche 'feature' elle-même est restée intacte en raison du processus de fusion. Notez le hachage de chaque commit. Après la fusion, les commits E (7c5c85e) et F (0286690) ont le même hachage sur les branches 'feature' et 'master'.


3. Fusion avec rebasage

Répétons l'étape 1 pour créer à nouveau les branches 'master' et 'feature'.

Résultats pour 'maître' :

$ git checkout master Basculé vers la branche 'master' $ git log --oneline 7f573d8 Commit C : ajout c.txt 795da3c Commit B : ajouté b.txt 0f4ed5b Commit A : ajout d'un.txt $ ls a.txtb.txt c.SMS 

Résultats pour 'fonctionnalité' :

$ git checkout feature Basculé vers la branche 'feature' $ git log --oneline 8ed0c4e Commit F : modifié b.txt 6e12b57 Commit E : modification d'un.txt 795da3c Commit B : ajouté b.txt 0f4ed5b Commit A : ajout d'un.txt $ ls a.txtb.SMS 

Rebasons à partir de la branche 'feature'.

$ git checkout feature Passage à la branche 'feature' $ git rebase master Tout d'abord, rembobinage de la tête pour rejouer votre travail dessus… Application : Commit E : modification d'un.txt Application : Commit F : modifié b.SMS 

Puis fusionnez 'feature' dans 'master'.

$ git checkout master Basculé vers la branche 'master' $ git merge feature Mise à jour 7f573d8… 9efa1a3 Avance rapide a.txt | 1 + b.txt | 1 + 2 fichiers modifiés, 2 insertions (+) 

Résultats pour la branche 'master' :

$ git checkout master Déjà sur 'master' $ git log --oneline 9efa1a3 Commit F : modifié b.txt 8710174 Commit E : modifié un.txt 7f573d8 Commit C : ajout c.txt 795da3c Commit B : ajouté b.txt 0f4ed5b Commit A : ajout d'un.txt $ ls a.txtb.txt c.SMS 

Résultats pour la branche « fonctionnalité » :

$ git checkout feature Basculé vers la branche 'feature' $ git log --oneline 9efa1a3 Commit F : modifié b.txt 8710174 Commit E : modifié un.txt 7f573d8 Commit C : ajout c.txt 795da3c Commit B : ajouté b.txt 0f4ed5b Commit A : ajout d'un.txt $ ls a.txtb.txt c.SMS 

Notez qu'après le rebase et la fusion, les deux branches sont les mêmes. De plus, les hachages pour E et F ont changé dans les deux branches. Fondamentalement, dans le scénario de rebase, voici ce qui s'est passé :

A - B - C \ E' - F' (fonctionnalité, maître) 

C'est pourquoi il n'y a pas de nouveau commit. Les commits E et F ont été recalculés et verrouillés à la fin de la branche 'master'.

Le rebasage est un outil utile lorsque vous souhaitez nettoyer l'historique de votre travail. Cependant, il y a un danger qui a donné naissance à la règle d'or.


Règle d'or du rebasage

La règle d'or du rebasage est :

Ne jamais rebaser une branche publique.

Comme vous pouvez le voir dans l'exemple ci-dessus, le rebasage recalcule les commits. Lorsque plusieurs personnes créent des branches à partir d'un référentiel public, le rebasage peut créer des situations où les développeurs qui ont créé de nouvelles branches se retrouveront dans des situations de fusion très compliquées. C'est donc une bonne idée de ne jamais rebaser les branches publiques qui sont partagées.

En conclusion:

Le rebasage est une fonctionnalité unique de Git. Mais à utiliser avec prudence.

Plus d'information:

Voici quelques liens pour une étude plus approfondie :

Documentation Git Rebase
Fusion Atlassian vs rebasage

Les références:

OpenTTD contre Simutrans
Créer votre propre simulation de transport peut être amusant, relaxant et extrêmement attrayant. C'est pourquoi vous devez vous assurer que vous essay...
Tutoriel OpenTTD
OpenTTD est l'un des jeux de simulation d'entreprise les plus populaires. Dans ce jeu, vous devez créer une merveilleuse entreprise de transport. Cepe...
SuperTuxKart pour Linux
SuperTuxKart est un excellent titre conçu pour vous apporter l'expérience Mario Kart gratuitement sur votre système Linux. C'est assez stimulant et am...