Git Rebase Tutorial

Git Rebase Tutorial
Anfänger von Git werden vor dem Rebase -Kommando gewarnt. Und zu Recht so. Mit all den neuen Dingen zu lernen, sind Anfänger wahrscheinlich besser, die grundlegenden Konzepte zu beherrschen. Wenn Sie jedoch die Grundlagen des Zusammenführens von Zweigen verstehen, kann es Ihnen helfen, einige komplizierte Entwicklungsrätsel zu lösen, wenn der richtige Zeitpunkt kommt.

Git -Rebase: Definitionen

Laut der Git -Dokumentation wird der Befehl rebase erneut auf eine andere Basispitze beauftragt. Diese Definition könnte ein wenig entmutigend sein. Es ist einfacher, Rebase als ein Verfahren zu erklären, das die Änderungen des aktuellen Zweigs zum Schwanz eines anderen Zweigs hinzufügt. Gehen wir durch ein Beispiel, um eine bessere Vorstellung davon zu bekommen, was passiert.

Git Rebasing -Beispiel

In diesem Beispiel erstellen wir zunächst einen Testfall mit "Master" und "Feature" -Ast. Dann werden wir eine Standardverführung durchführen. Als nächstes werden wir den Testfall neu erstellen und Rebase durchführen und verschmelzen.

1. Erstellen von Master- und Feature -Zweigen

Hier ist das Szenario, das wir erstellen werden:

A - B - C (Meister)
\
E - f (Funktion)

Im obigen Beispiel gehen wir den folgenden Weg:

  1. Commit A: Wir fügen a hinzu.TXT -Datei in der Master -Filiale
  1. Commit B: Wir fügen B hinzu b.TXT -Datei in der Master -Filiale
  1. Zu diesem Zeitpunkt erstellen wir die Filiale "Feature", was bedeutet, dass sie eine haben wird.txt und b.txt
  1. Commit C: Wir fügen C hinzu c.TXT -Datei in der Master -Filiale
  1. Wir gehen in die "Feature" -Ast
  1. Commit E: Wir ändern a.TXT in 'Feature' Branch
  1. Commit F: Wir ändern B.TXT in 'Feature' Branch

Sie können einen Ordner erstellen und den folgenden Code im Ordner ausführen, um die obige Situation zu erstellen:

Git init
Berühren Sie a.txt
Git add -a
Git Commit -m "Commit a: hinzugefügt a.txt"
Berührung b.txt
Git add -a
Git Commit -m "Commit B: hinzugefügt B hinzugefügt.txt"
Git Branch -Funktion
Berührung c.txt
Git add -a
Git Commit -m "Commit C: hinzugefügt c.txt"
Git -Status
Git Checkout -Funktion
echo aaa> a.txt
Git add -a
Git Commit -m "Commit e: modifiziert a.txt"
echo bbb> b.txt
Git add -a
Git Commit -m "Commit f: modifiziert B.txt"

2. Einfache Zusammenführung

Verwenden wir den Protokollbefehl, um beide Zweige zu überprüfen.

Ergebnisse für 'Master':

$ Git Checkout Master
Zum Branch "Master" umgestellt
$ Git -Protokoll -Einmal
2BBDE47 COMMIT C: C: C hinzugefügt c.txt
B430AB5 Commit B: hinzugefügt B hinzugefügt.txt
6f30e95 Commit a: hinzugefügt a.txt
$ ls
A.txt b.txt c.txt

Ergebnisse für 'Feature':

$ Git Checkout -Funktion
Auf die Filiale "Feature" umgeschaltet
$ Git -Protokoll -Einmal
0286690 Commit f: Modifiziert B.txt
7c5c85e Commit e: Modifiziert a.txt
B430AB5 Commit B: hinzugefügt B hinzugefügt.txt
6f30e95 Commit a: hinzugefügt a.txt
$ ls
A.txt b.txt

Beachten Sie, wie die Feature -Filiale kein Commit c hat C

Lassen Sie uns nun die Merge 'Feature "-Ast mit der" Master "-Ast ausführen. Sie werden gebeten, einen Kommentar einzugeben. Fügen Sie im Kommentar "Commit G:" Fügen Sie am Anfang hinzu, um es einfacher zu verfolgen.

$ Git Checkout Master
Zum Branch "Master" umgestellt
$ git merge feature
Zusammenführen durch die "rekursive" Strategie.
A.txt | 1 +
B.txt | 1 +
2 Dateien geändert, 2 Einfügungen (+)

Ergebnisse für 'Master':

$ Git Checkout Master
Bereits auf "Master"
$ Git -Protokoll -Einmal
D086FF9 Commit G: Merge Branch 'Feature'
0286690 Commit f: Modifiziert B.txt
7c5c85e Commit e: Modifiziert a.txt
2BBDE47 COMMIT C: C: C hinzugefügt c.txt
B430AB5 Commit B: hinzugefügt B hinzugefügt.txt
6f30e95 Commit a: hinzugefügt a.txt
$ ls
A.txt b.txt c.txt

Ergebnisse für 'Feature':

$ Git Checkout -Funktion
Auf die Filiale "Feature" umgeschaltet
$ Git -Protokoll -Einmal
0286690 Commit f: Modifiziert B.txt
7c5c85e Commit e: Modifiziert a.txt
B430AB5 Commit B: hinzugefügt B hinzugefügt.txt
6f30e95 Commit a: hinzugefügt a.txt
$ ls
A.txt b.txt

In der "Master" -Ast werden Sie feststellen. Grundsätzlich fand die folgenden Maßnahmen statt:

A - B - C - G (Meister)
\ /
E - f (Funktion)

Im Komit. Aber der "Feature" -Ast selbst ist aufgrund des Zusammenführungsverfahrens unberührt geblieben. Beachten Sie den Hash eines jeden Commits. Nach dem Zusammenführen haben E (7C5C85E) und F (0286690) Commit den gleichen Hash für die "Feature" und "Master" -Ast.


3. Mit dem Wiederaufbau verschmelzen

Wiederholen wir Schritt 1, um die "Master "- und" Feature "-Gäste wieder zu erstellen.

Ergebnisse für 'Master':

$ Git Checkout Master
Zum Branch "Master" umgestellt
$ Git -Protokoll -Einmal
7f573d8 Commit C: C: C hinzugefügt c.txt
795da3c Commit B: hinzugefügt B hinzugefügt.txt
0f4ed5b Commit a: hinzugefügt a.txt
$ ls
A.txt b.txt c.txt

Ergebnisse für 'Feature':

$ Git Checkout -Funktion
Auf die Filiale "Feature" umgeschaltet
$ Git -Protokoll -Einmal
8ed0c4e Commit f: Modifiziert B.txt
6E12B57 Commit E: Modifiziert a.txt
795da3c Commit B: hinzugefügt B hinzugefügt.txt
0f4ed5b Commit a: hinzugefügt a.txt
$ ls
A.txt b.txt

Lassen Sie uns aus der "Feature" -Ast wiederherstellen.

$ Git Checkout -Funktion
Auf die Filiale "Feature" umgeschaltet
$ Git Rebase Master
Zunächst einmal, den Kopf zurückspulen, um Ihre Arbeit darüber nachzubilden…
Bewerbung: Commit E: Modifiziert a.txt
Bewerbung: Commit f: Modifiziert B.txt

Dann merken Sie "Feature" in "Master".

$ Git Checkout Master
Zum Branch "Master" umgestellt
$ git merge feature
Aktualisieren von 7F573D8… 9EFA1A3
Schnell vorwärts
A.txt | 1 +
B.txt | 1 +
2 Dateien geändert, 2 Einfügungen (+)

Ergebnisse für den Master -Zweig:

$ Git Checkout Master
Bereits auf "Master"
$ Git -Protokoll -Einmal
9efa1a3 Commit f: Modifiziert B.txt
8710174 Commit E: Modifiziert a.txt
7f573d8 Commit C: C: C hinzugefügt c.txt
795da3c Commit B: hinzugefügt B hinzugefügt.txt
0f4ed5b Commit a: hinzugefügt a.txt
$ ls
A.txt b.txt c.txt

Ergebnisse für die "Feature" -Ast:

$ Git Checkout -Funktion
Auf die Filiale "Feature" umgeschaltet
$ Git -Protokoll -Einmal
9efa1a3 Commit f: Modifiziert B.txt
8710174 Commit E: Modifiziert a.txt
7f573d8 Commit C: C: C hinzugefügt c.txt
795da3c Commit B: hinzugefügt B hinzugefügt.txt
0f4ed5b Commit a: hinzugefügt a.txt
$ ls
A.txt b.txt c.txt

Beachten Sie, dass nach der Rebase und der Zusammenführung beide Zweige gleich sind. Auch die Hashes für E und F haben sich in beiden Zweigen verändert. Grundsätzlich ist im Rebase -Szenario das passiert:

A - b - c
\
E ' - f' (Feature, Master)

Deshalb gibt es kein neues Commit. Die E- und F -Commits wurden neu berechnet und bis zum Ende des "Master" -Asts eingesperrt.

Das Wiedergeburten ist ein nützliches Werkzeug, wenn Sie die Geschichte Ihrer Arbeit aufräumen möchten. Es besteht jedoch eine Gefahr, die die goldene Regel zur Welt gebracht hat.


Goldene Regel des Wiederaufbaus

Die goldene Regel des Wiederaufbaus lautet:

Niemals eine öffentliche Niederlassung wieder herstellen.

Wie Sie aus dem obigen Beispiel sehen können, berechnen sich die Wiederherstellung der Commits neu. Wenn sich mehrere Personen von einem öffentlichen Repository aus verzweigen lassen, kann das Wiederaufbau Situationen schaffen, in denen Entwickler, die neue Filialen erstellt haben. Es ist also eine gute Idee, niemals öffentliche Filialen wiederherzustellen, die geteilt werden.

Abschließend:

Wiedergeburt ist ein einzigartiges Merkmal von Git. Aber benutze es mit Vorsicht.

Mehr Informationen:

Hier sind einige Links für weitere Studien:

  • Git -Rebase -Dokumentation
  • Atlassianer Verschmelzung gegen Rebasing
  • So sehen Sie die Commit -Geschichte des Git -Repositorys
  • Zeigen Sie Git Tree im Terminal
  • https: // www.Atlassian.COM/GIT/Tutorials/Merging-VS-Rebasing
  • https: // git-scm.com/docs/git-rebase