Git

Git Rebase-Tutorial

Git Rebase-Tutorial

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:

  1. Commit A: wir fügen a . hinzu.txt-Datei im 'master'-Zweig
  1. Commit B: wir fügen b . hinzu.txt-Datei im 'master'-Zweig
  1. In dieser Phase erstellen wir das Branch-'Feature', was bedeutet, dass es a.txt und b.TXT
  1. Commit C: wir fügen c . hinzu.txt-Datei im 'master'-Zweig
  1. Wir gehen zum 'Feature'-Zweig
  1. Commit E: wir modifizieren a.txt im 'Feature'-Zweig
  1. 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:

Beste Befehlszeilenspiele für Linux
Die Befehlszeile ist nicht nur Ihr größter Verbündeter bei der Verwendung von Linux – sie kann auch eine Quelle der Unterhaltung sein, da Sie damit vi...
Beste Gamepad-Mapping-Apps für Linux
Wenn du Spiele unter Linux gerne mit einem Gamepad statt mit einem typischen Tastatur- und Maus-Eingabesystem spielst, gibt es einige nützliche Apps f...
Nützliche Tools für Linux-Spieler
Wenn Sie gerne unter Linux spielen, haben Sie wahrscheinlich Apps und Dienstprogramme wie Wine, Lutris und OBS Studio verwendet, um das Spielerlebnis ...