J'ai commencé à utiliser git rebase
récemment et je ne suis pas certain à 100% que je le fais bien. Pour les besoins de la question, il existe deux branches dans Origin, master
et next
, qui sont passées de master
.
Depuis la dernière synchronisation entre les deux, master
a eu 2 commits et next
6:
$ git log --oneline Origin/next..Origin/master
59b5552 master commit #2
485a811 master commit #1
$ git log --oneline Origin/master..Origin/next
4ebf401 next commit #6
e9b6586 next commit #5
197ada0 next commit #4
4a2c3c6 next commit #3
040a055 next commit #2
84537bf next commit #1
Lorsque j'achète next
et exécute git rebase -i Origin/master
, j'obtiens les informations suivantes:
$ git status
# On branch next
# Your branch and 'Origin/next' have diverged,
# and have 8 and 6 different commits each, respectively.
Et finalement, après git pull --rebase
, les deux commits de master
sont dans next
:
$ git log --oneline Origin/next..next
8741d09 master commit #2
485a811 master commit #1
Des questions:
8 and 6
jusqu'à ce que pull --rebase
soit exécuté?Infiniment reconnaissant :)
Commençons par le début. Voici un diagramme de votre état d'origine:
A-B-C (maître, origine/maître) \ D-E-F-G-H-I (suivant, Origine/suivante)
Lorsque vous avez extrait next
et rebasé next
en Origin/master
, il a créé 6 nouveaux commits après les deux déjà sur Origin/master
. Ces nouveaux commits ont comme ancêtre "commit commit # 2" (C
dans mon diagramme) et non pas leur ancêtre d'origine, où Origin/master
et Origin/next
ont divergé (A
dans mon diagramme), de sorte que leurs hachages seront différents. Je crois que c’est la raison pour laquelle vous verrez que next
a 8 commits différents à partir de Origin/next
: les 2 à partir de Origin/master
et les 6 commits "réorganisés" qui étaient sur Origin/next
.
Après git checkout next ; git rebase -i Origin/master
, vous devriez avoir ceci:
A-B-C (maître, origine/maître) \\ \D'-E'-F'-G'-H'-I '(suivant) \ D-E-F-G-H-I (Origine/suivante)
Vous pouvez voir que next
a 8 validations qui ne sont pas sur Origin/next
et que Origin/next
possède 6 validations qui ne sont pas sur next
. Certes, cela est juste en fonction des hashs SHA-1 des commits. Le contenu réel devrait correspondre très étroitement si vous git diff Origin/next next
- le diff devrait simplement montrer les modifications apportées de B
et C
(comme indiqué dans le diagramme).
Lorsque vous effectuez git pull --rebase
alors que vous êtes toujours sur next
, il récupère les modifications de la source (le Origin/next
distant) et rebase la branche actuelle (next
) sur cette télécommande. Ainsi, les modifications qui se trouvaient dans next
mais not in Origin/next
apparaissent après Origin/next
sur la nouvelle branche next
. Ça devrait ressembler à ça:
A-B-C (maître, origine/maître) \ D-E-F-G-H-I (Origine/suivante) \ B'-C '(suivant)
Si vous voulez que le graphique d'historique ressemble à cela, vous avez réussi.
Cependant, je suppose que vous souhaitiez vraiment que les éléments ressemblent au diagramme du milieu, en particulier si next
est une branche de fonctionnalité dans laquelle vous travaillez sur la partie suivante du projet et master
concerne le code stable et les petits correctifs. Si tel est le cas, vous auriez dû utiliser git Push
au lieu de git pull --rebase
pour que la télécommande reflète votre version de l'historique au lieu de l'inverse.
Commencez par les étapes très simples pour rebaser votre branche avec le maître; Name;
git-rebase
Synopsis;
git rebase [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
[<upstream>] [<branch>]
git rebase [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
--root [<branch>]
git rebase --continue | --skip | --abort | --edit-todo
Description; Supposons que l'historique suivant existe et que la branche actuelle est "échantillon":
A---B---C sample
/
D---E---F---G master
A partir de ce moment, le résultat de l'une des commandes suivantes:
git rebase master
git rebase master sample
serait:
A'--B'--C' sample
/
D---E---F---G master
NOTE: La dernière forme est juste un raccourci de git checkout sample
suivi de git rebase master
. Quand rebase quitte, l'échantillon restera la branche extraite.
Si la branche en amont contient déjà une modification que vous avez effectuée (par exemple, parce que vous avez envoyé un correctif qui a été appliqué en amont), cette validation sera ignorée. Par exemple, exécutez ‘git rebase master’ sur l’historique suivant (dans lequel A et A introduisent le même ensemble de modifications, mais ont des informations de committer différentes):
A---B---C sample
/
D---E---A'---F master
aura pour résultat:
B'---C' sample
/
D---E---A'---F master
Tous ces éléments étaient la compréhension schématique du processus de rebase. Une fois les conflits résolus après la saisie de git rebase master
Résolvez les conflits et saisissez git add -u
pour ajouter les codes modifiés au référentiel . Après cela, exécutez la commande git rebase --continue
et poursuivez la résolution des conflits et répétez la commande ;
git add -u
et
git rebase --continue
jusqu'à ce qu'aucun conflit ne soit trouvé .. Enfin, la dernière commande sera,
git Push --force Origin sample(your branch name)