web-dev-qa-db-fra.com

bases de git rebase

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:

  1. Est-ce que cette approche est correcte?
  2. Pourquoi y a-t-il __ commotions différentes 8 and 6 jusqu'à ce que pull --rebase soit exécuté?
  3. Est-il possible de simplifier le flux?

Infiniment reconnaissant :)

38
David Kuridža

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.

50
MikeSep

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)
0
Sam