Partage de technologie

[Git Study Notes] Chapitre 4 Opération de rebase git rebase et exemples associés (Partie 1)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Chapitre 4 Opérations de rebase et cas associés

【sujet connexe】

  • Volonté commit Rebase la version vers une autre branche
  • Effectuer un rebase en cas de conflit de version
  • Effectuer un rebase interactif sur une version spécifiée
  • Utiliser le rebasage interactif pour agréger les versions
  • Changer les committers à l'aide du rebasage interactif
  • Version agrégation automatique

4.0 Introduction au rebasage

Rebase (Rebasing ) est une fonctionnalité extrêmement puissante de Git.Le rebasage est un type d'opération : si uncommit UN La première était basée surcommit B de; alorsUN Rebase àC, c'est-à-dire sera UN devenir basé surC opération.

Dans le cas de démonstration suivant, vous constaterez que le rebasage n'est souvent pas aussi simple qu'il y paraît.

4.1 sera commit Rebase la version vers une autre branche

Examinons d’abord le type d’opération de rebase le plus simple. Travail de préparation associé : introduire un nouveau fichier, soumettre, modifier le contenu et soumettre à nouveau.De cette façon, il y a deux fois plus de locauxcommit Version.

Toujours avec jgit Bibliothèque par exemple :

# Clone jgit repo into chapter4
$ git clone https://git.eclipse.org/r/jgit/jgit chapter4
$ cd chapter4
# Checkout a new branch
$ git checkout -b rebaseExample --track origin/stable-3.1
# Create the 1st commit
$ echo "My Fishtank
    
Gravel, water, plants
Fish, pump, skeleton" > fishtank.txt
$ git add fishtank.txt
$ git commit -m "My brand new fishtank"
# Create the 2nd commit
$ echo "mosquitos" >> fishtank.txt
$ git add fishtank.txt
$ git commit -m "Feeding my fish"
# Rabase to stable-3.2
$ git rebase origin/stable-3.2
Successfully rebased and updated refs/heads/rebaseExample.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

Avant de rebaser :

Insérer la description de l'image ici

Après rebasage :

Insérer la description de l'image ici

git rebase Le processus d'exécution :

  1. venez HEAD La version commune entre la branche cible pointée par le rebase (merge-base);
  2. basé sur merge-base, recherchez toutes les versions manquantes sur la branche cible ;
  3. Essayez d'appliquer les versions manquantes une par une à la branche cible.

4.2 Effectuer un rebasage en cas de conflits de versions

Si un commit version ou unebranch Rebase une branche vers une autreHEAD , des conflits de versions sont susceptibles de se produire.À ce stade, le conflit doit être résolu et la commande doit être exécutéegit rebase --continue, le rebase peut être terminé.

Les exemples de cette section montrent comment réaliser un rebasage en présence de conflits.Suite au résultat final démontré dans la section 4.1, cette foisrebaseExample La succursale a été relocalisée àstable-3.2 bifurquer.L'exemple revérifiera la nouvelle branche de stable-3.1 et ajoutera un etrebaseExample Fichiers texte avec le même nom de branche mais un contenu incompatiblefishtank.txt

# Checkout rebaseExample2
$ git checkout -b rebaseExample2 --track origin/stable-3.1
# Add a new commit
$ echo "My Fishtank
Pirateship, Oister shell
Coconut shell
">fishtank.txt
$ git add fishtank.txt
$ git commit -m "My brand new fishtank"
# Rebase conflicting branches
$ git rebase rebaseExample
Auto-merging fishtank.txt
CONFLICT (add/add): Merge conflict in fishtank.txt
error: could not apply 24f9bf1ef... My brand new fishtank2
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply 24f9bf1ef... My brand new fishtank2
$ subl fishtank.txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

La situation conflictuelle est la suivante :

Insérer la description de l'image ici

Modifiez le contenu suivant, enregistrez et fermez :

Insérer la description de l'image ici

Ajoutez les fichiers fusionnés et continuez le rebasage :

$ git add fishtank.txt
$ git rebase --continue
hint: Waiting for your editor to close the file...
  • 1
  • 2
  • 3

L'éditeur qui s'ouvre est illustré sur la figure :

Insérer la description de l'image ici

Confirmez, enregistrez et fermez, et vous verrez une invite indiquant que le rebase a réussi :

$ git rebase --continue
[detached HEAD 9911772b3] My brand new fishtank2
 1 file changed, 2 insertions(+), 3 deletions(-)
Successfully rebased and updated refs/heads/rebaseExample2.
# Check new status via gitk
$ gitk
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Les détails sont les suivants:

Insérer la description de l'image ici

On peut voir que dans ce rebase, seules les versions présentes dans l'ancienne branche mais pas dans la nouvelle branche seront rebasées (c'est-à-dire que de nouvelles versions seront ajoutées) commit)。

Dans les informations de l'invite git de la première interruption du rebase, vous pouvez également voir deux alternatives :

  1. git rebase --abort: Au sens littéral, interrompez le rebase

  2. git rebase --skip : ignorez les conflits et rebasez directement, ce qui entraînera rebaseExample2 Jetez le nouveaucommit, directement fusionné dans rebaseExample, le parent a souligné après le rebasage, et rebaseExample Cohérent:

    Insérer la description de l'image ici


4.3 Effectuer un rebase interactif sur une version spécifiée

Dans cet exemple, nous utilisons le rebaseExample En fonction des branches, montrez comment utiliser--interactive Mark, rebase les deux en 4.1commit Rebase vers la branche de suivi à distancestable-3.1 supérieur:

$ git checkout rebaseExample
Switched to branch 'rebaseExample'
Your branch is ahead of 'origin/stable-3.1' by 109 commits.
  (use "git push" to publish your local commits)
$ git rebase origin/stable-3.1
  • 1
  • 2
  • 3
  • 4
  • 5

À ce stade, une liste de validations sera affichée dans le nouvel éditeur contextuel, avec la plage rebaseExample etstable-3.1 entre, tout peut être rebasé surstable-3.1 decommit Enregistrer.Gardez les deux nouveaux dans l'exemplecommit, supprimez tout le reste (c'est-à-dire le contenu de la ligne 89 et avant) :

Insérer la description de l'image ici

Après avoir enregistré, quittez l'éditeur et vous verrez le résultat suivant :

$ git rebase --interactive origin/stable-3.1
Successfully rebased and updated refs/heads/rebaseExample.
# Check in gitk view:
  • 1
  • 2
  • 3

Le résultat est le suivant :

Insérer la description de l'image ici

Exemple d'extension

Dans cet exemple, vous pouvez également obtenir rapidement l'effet souhaité via une commande :

$ git rebase --onto origin/stable-3.1 origin/stable-3.2 rebaseExample
Successfully rebased and updated refs/heads/rebaseExample.
  • 1
  • 2

Le schéma avant et après rebasage est le suivant :

Insérer la description de l'image ici