2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
【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
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.
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.
Avant de rebaser :
Après rebasage :
git rebase
Le processus d'exécution :
HEAD
La version commune entre la branche cible pointée par le rebase (merge-base
);merge-base
, recherchez toutes les versions manquantes sur la branche cible ;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
La situation conflictuelle est la suivante :
Modifiez le contenu suivant, enregistrez et fermez :
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...
L'éditeur qui s'ouvre est illustré sur la figure :
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
Les détails sont les suivants:
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 :
git rebase --abort
: Au sens littéral, interrompez le rebase
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:
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
À 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) :
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:
Le résultat est le suivant :
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.
Le schéma avant et après rebasage est le suivant :