Git-Anfänger werden vor dem Rebase-Befehl gewarnt. Und das zu Recht. Bei all den neuen Dingen, die es zu lernen gilt, ist es für Anfänger wahrscheinlich besser, die grundlegenden Konzepte zu beherrschen, bevor sie sich mit den Feinheiten des Rebasings befassen. Wenn Sie jedoch die Grundlagen des Zusammenführens von Zweigen verstehen, kann Ihnen das Wissen über das Rebase helfen, einige komplizierte Entwicklungsrätsel zu lösen, wenn der richtige Zeitpunkt gekommen ist.
Git Rebase: Definitionen
Laut der git-Dokumentation wird der rebase-Befehl Commits über einem anderen Basistipp erneut anwenden. Diese Definition mag ein wenig abschreckend sein. Es ist einfacher, Rebase als eine Prozedur zu erklären, die die Änderungen des aktuellen Zweigs am Ende eines anderen Zweigs hinzufügt. Lassen Sie uns ein Beispiel durchgehen, um eine bessere Vorstellung davon zu bekommen, was passiert.
Git-Rebasing-Beispiel
In diesem Beispiel erstellen wir zuerst einen Testfall mit 'master' und 'feature' Branch. Dann machen wir einen Standard-Merge. Als Nächstes erstellen wir den Testfall neu und führen Rebase und Merge durch.
1. Erstellen von Master- und Feature-Branches
Hier ist das Szenario, das wir erstellen werden:
A - B - C (Master) \ E - F (Funktion)
Im obigen Beispiel gehen wir den folgenden Weg:
- Commit A: wir fügen a . hinzu.txt-Datei im 'master'-Zweig
- Commit B: wir fügen b . hinzu.txt-Datei im 'master'-Zweig
- In dieser Phase erstellen wir das Branch-'Feature', was bedeutet, dass es a.txt und b.TXT
- Commit C: wir fügen c . hinzu.txt-Datei im 'master'-Zweig
- Wir gehen zum 'Feature'-Zweig
- Commit E: wir modifizieren a.txt im 'Feature'-Zweig
- Commit F: wir modifizieren b.txt im 'Feature'-Zweig
Sie können einen Ordner erstellen und den folgenden Code innerhalb des Ordners ausführen, um die obige Situation zu erstellen:
git init berühren a.txt git add -A git commit -m "Commit A: hinzugefügt a.txt" berühren b.txt git add -A git commit -m "Commit B: hinzugefügt b.txt" Git Branch-Funktion touch c touch.txt git add -A git commit -m "Commit C: c added hinzugefügt.txt" git status git checkout-Funktion echo aaa > a.txt git add -A git commit -m "Commit E: geändert a.txt" echo bbb > b.txt git add -A git commit -m "Commit F: modifiziert b.TXT"
2. Einfaches Zusammenführen
Lassen Sie uns den log-Befehl verwenden, um beide Zweige zu überprüfen.
Ergebnisse für 'Meister':
$ git checkout master Zu Branch 'master' gewechselt $ git log --oneline 2bbde47 Commit C: c added hinzugefügt.txt b430ab5 Commit B: hinzugefügt b.txt 6f30e95 Commit A: hinzugefügt a.txt $ ls a.txt b.txt c.TXT
Ergebnisse für 'Feature':
$ git checkout Feature Wechseln zu Branch 'feature' $ git log --oneline 0286690 Commit F: geändert b.txt 7c5c85e Commit E: geändert a.txt b430ab5 Commit B: hinzugefügt b.txt 6f30e95 Commit A: hinzugefügt a.txt $ ls a.txt b.TXT
Beachten Sie, dass der Feature-Zweig kein Commit C hat
Lassen Sie uns nun den 'feature'-Zweig mit dem 'master'-Zweig zusammenführen. Sie werden aufgefordert, einen Kommentar einzugeben. Fügen Sie im Kommentar "Commit G:" am Anfang hinzu, um die Verfolgung zu erleichtern.
$ git checkout master Zu Branch 'master' gewechselt $ git Merge-Funktion Zusammenführen durch die 'rekursive' Strategie. ein.txt | 1 + b.txt | 1 + 2 Dateien geändert, 2 Einfügungen (+)
Ergebnisse für 'Meister':
$ git checkout master Bereits auf 'master' $ git log --oneline d086ff9 Commit G: Merge-Zweig 'feature' 0286690 Commit F: modifiziert b.txt 7c5c85e Commit E: geändert a.txt 2bbde47 Commit C: c added hinzugefügt.txt b430ab5 Commit B: hinzugefügt b.txt 6f30e95 Commit A: hinzugefügt a.txt $ ls a.txt b.txt c.TXT
Ergebnisse für 'Feature':
$ git checkout Feature Wechseln zu Branch 'feature' $ git log --oneline 0286690 Commit F: geändert b.txt 7c5c85e Commit E: geändert a.txt b430ab5 Commit B: hinzugefügt b.txt 6f30e95 Commit A: hinzugefügt a.txt $ ls a.txt b.TXT
Im 'master'-Zweig werden Sie feststellen, dass es einen neuen Commit G gibt, der die Änderungen aus dem 'feature'-Zweig zusammengeführt hat. Grundsätzlich ist folgende Aktion erfolgt:
A - B - C - G (Master) \ / E - F (Funktion)
Im Commit G wurden alle Änderungen aus dem 'Feature'-Zweig in den Master-Zweig übernommen. Aber der 'Feature'-Zweig selbst ist aufgrund des Merge-Prozesses unangetastet geblieben. Beachten Sie den Hash jedes Commits. Nach der Zusammenführung haben Commit E (7c5c85e) und F (0286690) den gleichen Hash auf den Zweigen 'feature' und 'master'.
3. Zusammenführen mit Rebasing
Lassen Sie uns Schritt 1 wiederholen, um die Zweige 'master' und 'feature' erneut zu erstellen.
Ergebnisse für 'Meister':
$ git checkout master Zu Branch 'master' gewechselt $ git log --oneline 7f573d8 Commit C: c hinzugefügt.txt 795da3c Commit B: hinzugefügt b.txt 0f4ed5b Commit A: hinzugefügt a.txt $ ls a.txt b.txt c.TXT
Ergebnisse für 'Feature':
$ git checkout-Funktion Umgestellt auf Branch 'feature' $ git log --oneline 8ed0c4e Commit F: geändert b.txt 6e12b57 Commit E: geändert a.txt 795da3c Commit B: hinzugefügt b.txt 0f4ed5b Commit A: hinzugefügt a.txt $ ls a.txt b.TXT
Lass uns vom 'Feature'-Zweig rebasieren.
$ git checkout-Funktion Wechseln zu Branch 'feature' $ git rebase master Zuerst Kopf zurückspulen, um Ihre Arbeit darüber abzuspielen… Anwenden: Commit E: modifiziert a.txt Anwenden: Commit F: geändert b.TXT
Dann 'feature' in 'master' zusammenführen.
$ git checkout master Zu Branch 'master' gewechselt $ git Merge-Funktion Aktualisieren 7f573d8… 9efa1a3 Schneller Vorlauf a.txt | 1 + b.txt | 1 + 2 Dateien geändert, 2 Einfügungen (+)
Ergebnisse für 'Master'-Zweig:
$ git checkout master Bereits auf 'master' $ git log --oneline 9efa1a3 Commit F: geändert b.txt 8710174 Commit E: geändert a.txt 7f573d8 Commit C: c added hinzugefügt.txt 795da3c Commit B: hinzugefügt b.txt 0f4ed5b Commit A: hinzugefügt a.txt $ ls a.txt b.txt c.TXT
Ergebnisse für den Zweig 'Feature':
$ git checkout-Funktion Umgestellt auf Branch 'feature' $ git log --oneline 9efa1a3 Commit F: geändert b.txt 8710174 Commit E: geändert a.txt 7f573d8 Commit C: c added hinzugefügt.txt 795da3c Commit B: hinzugefügt b.txt 0f4ed5b Commit A: hinzugefügt a.txt $ ls a.txt b.txt c.TXT
Beachten Sie, dass nach dem Rebase und Merge beide Branches gleich sind. Außerdem haben sich die Hashes für E und F in beiden Zweigen geändert. Im Grunde ist im Rebase-Szenario Folgendes passiert:
A - B - C \ E' - F' (Merkmal, Master)
Deshalb gibt es kein neues Commit. Die E- und F-Commits wurden neu berechnet und an das Ende des 'Master'-Zweigs gelatcht.
Rebasing ist ein nützliches Werkzeug, wenn Sie den Verlauf Ihrer Arbeit bereinigen möchten. Es besteht jedoch eine Gefahr, die die goldene Regel hervorgebracht hat.
Goldene Regel der Umbasierung
Die goldene Regel des Rebasings lautet:
Niemals eine öffentliche Filiale umbasieren.
Wie Sie im obigen Beispiel sehen können, berechnet das Rebasing die Commits neu re. Wenn mehrere Personen von einem öffentlichen Repository verzweigen, kann das Rebasing zu Situationen führen, in denen Entwickler, die neue Verzweigungen erstellt haben, in sehr komplizierte Zusammenführungssituationen geraten. Es ist also eine gute Idee, öffentliche Zweige, die gemeinsam genutzt werden, niemals umzubasieren.
Abschließend:
Rebasing ist eine einzigartige Funktion von Git. Aber mit Vorsicht verwenden.
Mehr Informationen:
Hier einige Links zum weiteren Studium:
Git Rebase-Dokumentation
Atlassian Merging vs. Rebasing
Verweise:
- https://www.Atlassianer.com/git/tutorials/merging-vs-rebasing
- Versionskontrolle mit Git - 07 - Rebase [https://www.Youtube.com/watch?v=cSf8cO0WB4o]
- https://git-scm.com/docs/git-rebase
- Was ist Git-Rebase?? [https://www.Youtube.com/watch?v=TymF3DpidJ8]
- https://medium.Freecodecamp.org/git-rebase-and-the-golden-rule-explained-70715eccc372