Git-Rebase: Alles, was Sie wissen müssen

Veröffentlicht: 2022-12-15
Laptop auf blauem Hintergrund mit einer Linux-Eingabeaufforderung.
fatmawati achmad zaenuri/Shutterstock.com
Der Git-Rebase-Befehl verschiebt einen Branch an eine neue Position am Anfang eines anderen Branches. Im Gegensatz zum Merge-Befehl von Git beinhaltet Rebase das Umschreiben Ihres Projektverlaufs. Es ist ein großartiges Tool, aber rebasieren Sie keine Commits, auf denen andere Entwickler basieren.

Der Git rebase Befehl kombiniert zwei Quellcode-Zweige zu einem. Der merge -Befehl von Git macht das auch. Wir erklären, was rebase macht, wie es verwendet wird und wann man stattdessen merge verwendet.

Inhaltsverzeichnis

Die Git-Explosion
Was ist Git-Merge?
Was ist Git-Rebase?
So rebasieren Sie auf einen anderen Zweig
Git Rebase vs. Merge: Welche sollten Sie verwenden?
Rebasieren oder nicht rebasen?

Die Git-Explosion

Frustriert von anderen Versionskontrollsystemen und deren langsamen Updates und Commits, nahm sich Linus Torvalds, ein berühmter Linux-Kernel, 2005 einen Monat Zeit, um sein eigenes zu schreiben. Er nannte es Git.

Seiten wie GitHub, GitLab und BitBucket haben Git symbiotisch gefördert und davon profitiert. Heute wird Git weltweit verwendet, wobei 98 Prozent von 71.000 Befragten in einer Umfrage von 2022 Git als Versionskontrollsystem verwenden.

Eine der wichtigsten Designentscheidungen von Git war die Geschwindigkeit. Insbesondere die Arbeit mit Filialen musste so schnell wie möglich sein. Verzweigungen sind ein grundlegender Bestandteil von Versionskontrollsystemen. Ein Projekt-Repository hat einen Haupt- oder Master-Zweig. Hier befindet sich die Codebasis des Projekts. Die Entwicklung, wie z. B. neue Funktionen, findet in getrennten Seitenzweigen statt. Dadurch wird verhindert, dass die in Branches geleistete Arbeit den Master-Branch durcheinander bringt, und es ermöglicht die gleichzeitige Entwicklung in verschiedenen Teilen der Codebasis.

So wählen Sie das für Ihr Team geeignete Git-Workflow- und Branching-Modell aus
VERWANDTE So wählen Sie das Git-Workflow- und Verzweigungsmodell aus, das für Ihr Team geeignet ist

Wenn die Entwicklungen in den Nebenzweigen abgeschlossen sind, werden die Änderungen in den Master-Branch übertragen, indem der Entwicklungs-Branch in den Master-Branch gemergt wird. In anderen Versionskontrollsystemen war das Arbeiten mit Verzweigungen schwierig und rechenintensiv. Das Arbeiten mit Zweigen in Git ist sehr schnell und sehr leicht. Was in anderen Systemen einst eine mühsame und oft vermiedene Übung war, wurde in Git trivial.

Der Git rebase Befehl ist eine weitere Möglichkeit, die Änderungen von einem Branch in einen anderen Branch zu übertragen. Die merge und rebase Befehle haben ähnliche Ziele, aber sie erreichen ihre Ziele auf unterschiedliche Weise und liefern leicht unterschiedliche Ergebnisse.

Was ist Git-Merge?

Wozu also der Git- merge -Befehl? Angenommen, Sie haben einen Branch namens dev-branch erstellt, um an einem neuen Feature zu arbeiten.

Ein Diagramm eines Master-Branch und eines nicht zusammengeführten Branch namens dev-Branch
Dave McKay/How-To-Geek

Sie machen ein paar Commits und testen Ihr neues Feature. Es funktioniert alles gut. Jetzt möchten Sie Ihr neues Feature an den master Branch senden. Sie müssen sich im master Zweig befinden, um einen anderen mit ihm zusammenzuführen.

Wir können sicherstellen, dass wir uns im master Zweig befinden, indem wir ihn explizit auschecken, bevor wir zusammenführen.

 git Checkout-Master

Wir können Git jetzt anweisen, den dev-branch mit dem Current-Branch, dem master -Branch, zusammenzuführen.

 git merge dev-branch 

Merge des dev-Branch-Branch in den Master-Branch

Unsere merge ist für uns abgeschlossen. Wenn Sie den master Zweig auschecken und kompilieren, enthält er die neu entwickelte Funktion. Was Git tatsächlich durchgeführt hat, ist eine Drei-Wege-Zusammenführung. es vergleicht die neusten Commits in den Branches master und dev-branch und das Commit im master -branch unmittelbar vor der Erstellung des dev-branch . Anschließend führt es einen Commit auf dem master Zweig durch.

Zusammenführungen gelten als nicht destruktiv, da sie nichts löschen und nichts am Git-Verlauf ändern. Der dev-branch existiert noch, und keiner der vorherigen Commits wird geändert. Ein neuer Commit wird erstellt, der die Ergebnisse der Drei-Wege-Zusammenführung erfasst.

Nach der Zusammenführung sieht unser Git-Repository aus wie eine Zeitleiste mit einer alternativen Linie, die abzweigt und dann zur Hauptzeitleiste zurückkehrt.

Der Branch dev-branch wurde mit dem master-Branch zusammengeführt
Dave McKay/How-to-Geek

Der dev-branch wurde in den master -Branch integriert.

Wenn Sie viele Verzweigungen in einem Projekt haben, kann die Historie des Projekts unübersichtlich werden. Dies ist oft der Fall, wenn ein Projekt viele Mitwirkende hat. Da sich der Entwicklungsaufwand in viele verschiedene Pfade aufteilt, ist die Entwicklungsgeschichte nicht linear. Das Entwirren des Commit-Verlaufs wird sogar noch schwieriger, wenn Zweige ihre eigenen Zweige haben.

Wie funktionieren Git-Branches?
RELATED Wie funktionieren Git Branches?

Beachten Sie, dass Sie bei nicht festgeschriebenen Änderungen im master Zweig etwas mit diesen Änderungen tun müssen, bevor Sie etwas damit zusammenführen können. Sie könnten einen neuen Zweig erstellen und die Änderungen dort festschreiben und dann die Zusammenführung durchführen. Sie müssten dann Ihren temporären Zweig wieder mit dem Master-Branch zusammenführen.

Das funktioniert, aber Git hat einen Befehl, der dasselbe erreicht, ohne dass neue Branches erstellt werden müssen. Der Befehl stash speichert Ihre nicht festgeschriebenen Änderungen für Sie und lässt Sie sie mit stash pop .

Sie würden sie wie folgt verwenden:

 verstauen

git merge dev-branch

Stash-Pop

Das Endergebnis ist ein zusammengeführter Zweig, in dem Ihre nicht gespeicherten Änderungen wiederhergestellt sind.

Was ist Git-Rebase?

Der Git rebase Befehl erreicht seine Ziele auf ganz andere Weise. Es nimmt alle Commits aus dem Zweig, den Sie rebasen werden, und spielt sie am Ende des Zweigs ab, auf den Sie rebasen.

In unserem vorherigen Beispiel sieht unser Git-Repository so aus, bevor wir eine Aktion durchgeführt haben. Wir haben einen Branch namens dev-branch und möchten diese Änderungen in den master -Branch verschieben.

Ein Diagramm eines Master-Branch und eines nicht zusammengeführten Branch namens dev-Branch
Dave McKay/How-To-Geek

Nach dem rebase sieht es aus wie eine einzige, vollständig lineare Zeitachse der Änderungen.

Der Master-Branch mit dem darauf rebasierten dev-Branch
Dave McKay/How-to-Geek

Der dev-branch wurde entfernt und die Commits im dev-branch wurden dem Master-Branch hinzugefügt. Das Endergebnis ist das gleiche, als ob die Commits im dev-branch tatsächlich direkt an den master -Branch übergeben worden wären. Die Commits werden nicht einfach an den master Branch geheftet, sie werden „replayed“ und frisch hinzugefügt.

Aus diesem Grund wird der rebase Befehl als destruktiv angesehen. Der rebasierte Branch existiert nicht mehr als separater Branch und der Git-Verlauf Ihres Projekts wurde neu geschrieben. Sie können zu einem späteren Zeitpunkt nicht mehr feststellen, welche Commits ursprünglich an den dev-branch gemacht wurden.

Es hinterlässt jedoch einen vereinfachten, linearen Verlauf. Im Vergleich zu einem Repository mit Dutzenden oder sogar Hunderten von Verzweigungen und Zusammenführungen, dem Lesen des Git-Protokolls oder der Verwendung einer grafischen Git-GUI, um ein Diagramm des Repositorys anzuzeigen, ist ein rebasiertes Repository ein Kinderspiel.

So rebasieren Sie auf einen anderen Zweig

Versuchen wir es mit einem git rebase Beispiel. Wir haben ein Projekt mit einem Branch namens new-feature . Wir würden diesen Branch wie folgt auf den master Branch rebase .

Zuerst überprüfen wir, ob der master Zweig keine ausstehenden Änderungen aufweist.

 Git-Status

Wir checken den new-feature Zweig aus.

 git checkout new-feature

Wir weisen Git an, den aktuellen Branch auf den Master-Branch rebase .

 Git-Rebase-Master

Wir können sehen, dass wir noch zwei Zweige haben.

 Git-Zweig

Wir wechseln zurück zum master Zweig

 git Checkout-Master

Wir führen den New-Feature-Branch mit dem Current-Branch zusammen, der in unserem Fall der master Branch ist.

 git merge new-feature 
Der Master-Branch mit dem darauf rebasierten New-Feature
Dave McKay/How-to-Geek

Interessanterweise haben wir nach der endgültigen Zusammenführung immer noch zwei Zweige.

Verwenden des Git-Branch-Befehls zum Auflisten der Branches im Git-Repository
Dave McKay/How-to-Geek

Der Unterschied besteht darin, dass der Kopf des new-feature Zweigs und der Kopf des master -Zweigs jetzt so eingestellt sind, dass sie auf denselben Commit zeigen, und der Git-Verlauf zeigt nicht, dass es früher einen separaten new-feature Zweig gab, abgesehen davon das Filialkennzeichen.

Der Master-Branch mit dem darauf rebasierten dev-Branch
Dave McKay/How-to-Geek

Git Rebase vs. Merge: Welche sollten Sie verwenden?

Es geht nicht um rebase vs. merge . Sie sind beide mächtige Befehle und Sie werden sie wahrscheinlich beide verwenden. Allerdings gibt es Anwendungsfälle, in denen rebase nicht wirklich gut funktioniert. Das Aufheben von Fehlern, die durch Fehler beim merge verursacht werden, ist unangenehm, aber das Aufheben von Fehlern, die durch rebase verursacht werden, ist höllisch.

Wenn Sie der einzige Entwickler sind, der ein Repository verwendet, ist die Wahrscheinlichkeit geringer, dass Sie mit rebase etwas katastrophales tun. Sie könnten beispielsweise immer noch in die falsche Richtung rebase und Ihren Master-Branch auf Ihren new-feature Branch rebase . Um Ihren master Branch zurückzubekommen, müssten Sie erneut rebase , diesmal von Ihrem new-feature Branch auf Ihren master -Branch. Das würde Ihren master -Zweig wiederherstellen, wenn auch mit einem seltsam aussehenden Verlauf.

Verwenden rebase nicht für gemeinsam genutzte Branches, in denen andere wahrscheinlich funktionieren. Ihre Änderungen an Ihrem Repository werden vielen Leuten Probleme bereiten, wenn Sie Ihren rebasierten Code in Ihr Remote-Repository übertragen.

Wenn Ihr Projekt mehrere Mitwirkende hat, sollten Sie rebase nur in Ihrem lokalen Repository und nicht in öffentlichen Zweigen verwenden. Wenn Pull-Requests Teil Ihrer Codeüberprüfungen sind, verwenden Sie ebenfalls nicht rebase . Oder verwenden Sie zumindest kein rebase , nachdem Sie die Pull-Anforderung erstellt haben. Andere Entwickler sehen sich wahrscheinlich Ihre Commits an, was bedeutet, dass sich diese Änderungen in einem öffentlichen Zweig befinden, auch wenn sie sich nicht im master Zweig befinden.

Die Gefahr besteht darin, dass Sie Commits rebase , die bereits in ein Remote-Repository gepusht wurden, und andere Entwickler möglicherweise bereits auf diesen Commits gearbeitet haben. Ihr lokaler rebase wird diese bestehenden Commits verschwinden lassen. Wenn Sie diese Änderungen in das Repository schieben, werden Sie nicht beliebt sein.

Wie man Git-Commits repariert, bearbeitet oder rückgängig macht (Ändern des Git-Verlaufs)
RELATED Wie man Git-Commits repariert, bearbeitet oder rückgängig macht (Ändern des Git-Verlaufs)

Andere Mitwirkende müssen eine unordentliche merge durchlaufen, um ihre Arbeit zurück in das Repository zu verschieben. Wenn Sie dann ihre Änderungen zurück in Ihr lokales Repository ziehen, stehen Sie vor einem Durcheinander von doppelten Änderungen.

Rebasieren oder nicht rebasen?

Rebase könnte in Ihrem Projekt verboten sein. Es kann lokale, kulturelle Einwände geben. Einige Projekte oder Organisationen betrachten rebase als eine Form der Häresie und als Akt der Schändung. Einige Leute glauben, dass der Git-Verlauf eine unantastbare, dauerhafte Aufzeichnung dessen sein sollte, was passiert ist. rebase könnte also vom Tisch sein.

Lokal verwendet, in privaten Zweigen, ist rebase jedoch ein nützliches Werkzeug.

Pushen Sie, nachdem Sie rebasiert haben, und beschränken Sie es auf Branches, in denen Sie der einzige Entwickler sind. Oder zumindest, wo die gesamte Entwicklung aufgehört hat und niemand sonst irgendeine andere Arbeit auf den Commits Ihres Zweigs basiert hat.

Wenn Sie das tun, vermeiden Sie Probleme.

VERWANDT: So überprüfen und aktualisieren Sie Ihre Git-Version