it-swarm.com.de

git Rebase Grundlagen

Ich habe vor kurzem mit git rebase angefangen und bin nicht zu 100% sicher, dass ich es richtig mache. Für die Frage gibt es in Origin zwei Zweige, master und next, die von master verzweigt wurden.

Seit der letzten Synchronisierung zwischen den beiden hatte master 2 Commits und 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

Wenn ich next auschecke und git rebase -i Origin/master ausführe, erhalte ich Folgendes:

$ git status
# On branch next
# Your branch and 'Origin/next' have diverged,
# and have 8 and 6 different commits each, respectively.

Und schließlich, nachdem git pull --rebase ausgeführt wurde, sind die beiden Commits von master in next:

$ git log --oneline Origin/next..next 
8741d09 master commit #2
485a811 master commit #1

Fragen:

  1. Ist das der richtige Ansatz?
  2. Warum gibt es 8 and 6 unterschiedliche Commits, bis pull --rebase ausgeführt wird?
  3. Kann der Fluss vereinfacht werden?

Herzlichen Dank :)

38
David Kuridža

Fangen wir von vorne an. Hier ist ein Diagramm Ihres ursprünglichen Zustands:

 A-B-C (Master, Herkunft/Master) 
\
 D-E-F-G-H-I (nächstes, Ursprung/nächstes) 

Wenn Sie next ausgecheckt und next auf Origin/master umgestellt haben, wurden nach den beiden bereits Origin/master neuen Commits 6 neue Commits erstellt. Diese neuen Commits haben "master commit # 2" (C in meinem Diagramm) als ihren Vorfahren, nicht ihren ursprünglichen Vorfahren, wobei Origin/master und Origin/next voneinander abweichen (A in meinem Diagramm), so dass sich ihre Hashes unterscheiden. Ich glaube, aus diesem Grund werden Sie sehen, dass next 8 verschiedene Commits von Origin/next hat: die 2 von Origin/master und die 6 "rehashed" -Commits, die sich auf Origin/next befanden.

Nach git checkout next ; git rebase -i Origin/master sollten Sie Folgendes haben:

 A-B-C (Master, Herkunft/Master) 
\\ 
\D'-E'-F'-G'-H'-I '(nächstes) 
\
 D-E-F-G-H-I (Herkunft/Nächste) 

Sie können sehen, dass next 8 Commits hat, die sich nicht auf Origin/next befinden, und Origin/next 6 Commits hat, die sich nicht auf next befinden. Zugegeben, dies entspricht genau den SHA-1-Hashes der Commits. Der tatsächliche Inhalt sollte sehr genau übereinstimmen, wenn Sie git diff Origin/next next - der Diff sollte nur die Änderungen von B und C (wie im Diagramm angegeben) anzeigen.

Wenn Sie git pull --rebase verwenden, während Sie noch next verwenden, ruft es Änderungen von der Quelle (dem Origin/next der Fernbedienung) ab und bindet den aktuellen Zweig (next) auf die Fernbedienung. Dies führt dazu, dass die Änderungen, die in next aber not in Origin/next vorgenommen wurden, nach Origin/next im neuen Zweig next angezeigt werden. Es sollte so aussehen:

 A-B-C (Master, Herkunft/Master) 
\
 D-E-F-G-H-I (Herkunft/Nächste) 
\
 B'-C '(nächstes) 

Wenn das Verlaufsdiagramm so aussehen soll, haben Sie es geschafft.

Ich vermute jedoch, dass Sie wirklich wollten, dass die Dinge wie das mittlere Diagramm aussehen, insbesondere wenn next ein Funktionszweig ist, in dem Sie am nächsten Teil des Projekts arbeiten, und master für stabilen Code und kleine Fehlerbehebungen. Wenn ja, dann hätten Sie git Push anstelle von git pull --rebase tun sollen, damit die Fernbedienung Ihre Version des Verlaufs widerspiegelt und nicht umgekehrt.

50
MikeSep

Beginnen Sie mit den sehr einfachen Schritten, um Ihren Zweig mit dem Master neu zu basieren; Name;

git-rebase

Zusammenfassung;

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

Beschreibung; Angenommen, die folgende Historie ist vorhanden und der aktuelle Zweig ist "Beispiel":

 A---B---C sample
         /
    D---E---F---G master

Ab diesem Punkt das Ergebnis eines der folgenden Befehle:

git rebase master
git rebase master sample

wäre:

A'--B'--C' sample
                 /
    D---E---F---G master

NOTE: Die letztere Form ist nur eine Kurzform von git checkout sample, gefolgt von git rebase master. Wenn Rebase Exits beendet wird, bleibt Sample der ausgecheckte Zweig.

Wenn der Upstream-Zweig bereits eine Änderung enthält, die Sie vorgenommen haben (z. B. weil Sie einen Patch gesendet haben, der Upstream angewendet wurde), wird dieses Commit übersprungen. Wenn Sie beispielsweise "git rebase master" für die folgende Historie ausführen (in der A und A die gleichen Änderungen vornehmen, jedoch unterschiedliche Committer-Informationen enthalten):

A---B---C sample
         /
    D---E---A'---F master

wird darin enden, dass:

 B'---C' sample
              /
D---E---A'---F master

All dies war das grafische Verständnis des Rebase-Prozesses. Nachdem Sie die gefundenen Konflikte nach der Eingabe von git rebase master.__ gelöst haben, lösen Sie die Konflikte, und geben Sie git add -u ein, um die geänderten Codes zum Repository hinzuzufügen. Danach führen Sie den Befehl git rebase --continue aus und setzen die Konflikte fort ;

git add -u 

und 

git rebase --continue 

bis keine Konflikte gefunden werden .. Endlich wird der letzte Befehl sein:

git Push --force Origin sample(your branch name)
0
Sam