Git Kurz und bündig Zweige

Verzweigungen vervielfachen die grundlegende Funktionalität, die Commits bieten, indem sie Benutzern erlauben, ihre Historie zu verzweigen. Das Erstellen eines neuen Zweigs ähnelt dem Anfordern einer neuen Entwicklungsumgebung mit einem isolierten Arbeitsverzeichnis, einem Bereitstellungsbereich und einem Projektverlauf.


Grundlegende verzweigte Entwicklung

Dies gibt Ihnen die gleiche Sicherheit wie eine "sichere" Kopie Ihres Projekts, aber Sie haben jetzt die zusätzliche Fähigkeit, an mehreren Versionen gleichzeitig zu arbeiten. Verzweigungen ermöglichen a nichtlinearer Workflow-die Fähigkeit, nicht verwandte Funktionen parallel zu entwickeln. Wie wir später erfahren werden, ist ein nichtlinearer Workflow ein wichtiger Vorläufer für das verteilte Wesen des Kooperationsmodells von Git.

Im Gegensatz zu SVN oder CVS ist die Zweigimplementierung von GIT unglaublich effizient. SVN ermöglicht Verzweigungen, indem das gesamte Projekt in einen neuen Ordner kopiert wird, ähnlich wie Sie es ohne Revisionssteuerungssoftware tun würden. Dies führt zu unbeholfenen, fehleranfälligen und langsamen Zusammenführungen. Im Gegensatz dazu sind Git-Zweige einfach ein Hinweis auf ein Commit. Da Git-Zweige auf der Festschreibungsebene und nicht direkt auf Dateiebene arbeiten, ist es viel einfacher, unterschiedliche Historien zusammenzuführen. Dies hat dramatische Auswirkungen auf die Verzweigungsworkflows.


Zweige manipulieren

Git trennt die Verzweigungsfunktionalität in einige verschiedene Befehle. Das Git-Zweig Befehl wird zum Auflisten, Erstellen oder Löschen von Zweigen verwendet.

Listing Niederlassungen

In erster Linie müssen Sie Ihre vorhandenen Niederlassungen anzeigen können:

 Git-Zweig

Dadurch werden alle Ihre aktuellen Zweige zusammen mit einem Sternchen neben dem derzeit "ausgecheckten" (mehr dazu später) ausgegeben:

 * Meistere einige schnelle Fehlerbehebungen

Das Meister Branch ist Gits Standard-Zweig, der mit dem ersten Commit in einem beliebigen Repository erstellt wird. Viele Entwickler verwenden diesen Zweig als "Hauptgeschichte" des Projekts - ein permanenter Zweig, der alle wesentlichen Änderungen enthält, die er durchläuft.

Zweige erstellen

Sie können einen neuen Zweig erstellen, indem Sie den Zweignamen an diesen übergeben Git-Zweig Befehl:

 Git-Zweig 

Dadurch wird ein Zeiger auf den aktuellen erstellt KOPF, aber tut nicht Wechseln Sie zum neuen Zweig (Sie benötigen git checkout dafür). Unmittelbar nach dem Anfordern eines neuen Zweigs sieht Ihr Repository in etwa wie folgt aus.


Einen neuen Zweig erstellen

Ihre aktuelle Niederlassung (Meister) und die neue Branche (einige funktion) Beide verweisen auf dasselbe Commit, aber alle neuen Commits, die Sie aufzeichnen, sind exklusiv für den aktuellen Zweig. Auf diese Weise können Sie parallel an nicht verwandten Features arbeiten und gleichzeitig sinnvolle Historien beibehalten. Zum Beispiel, wenn Ihre aktuelle Niederlassung war einige funktion, Ihre Geschichte würde nach dem Festhalten eines Schnappschusses wie folgt aussehen.


Commit auf der einige funktion Ast

Das neue KOPF (gekennzeichnet durch das hervorgehobene Commit) existiert nur im einige funktion Ast. Es wird nicht in der Protokollausgabe von angezeigt Meister, Die Änderungen werden auch nach dem Auschecken nicht im Arbeitsverzeichnis angezeigt Meister.

Sie können den neuen Zweig tatsächlich in der internen Datenbank sehen, indem Sie die Datei öffnen .git / refs / köpfe /. Die Datei enthält die ID des referenzierten Commits und ist die einzige Definition eines Git-Zweigs. Dies ist der Grund, warum Filialen so leicht und einfach zu handhaben sind.

Zweige löschen

Zum Schluss können Sie Zweige über löschen -d Flagge:

 Git-Zweig -d 

Das Engagement von Git, nie Ihre Arbeit zu verlieren, verhindert jedoch, dass Zweige mit nicht zusammengeführten Commits entfernt werden. Um das Löschen zu erzwingen, verwenden Sie die -D stattdessen kennzeichnen:

 Git-Zweig -D 

Nicht zusammengeführte Änderungen gehen verloren sei sehr vorsichtig mit diesem Befehl.


Filialen auschecken

Natürlich ist das Erstellen von Zweigen ohne die Möglichkeit, zwischen ihnen zu wechseln, nutzlos. Git nennt dieses "Auschecken" einen Zweig:

 git checkout 

Nachdem Sie den angegebenen Zweig ausgecheckt haben, wird Ihr Arbeitsverzeichnis entsprechend dem Festschreiben des angegebenen Zweigs aktualisiert. zusätzlich KOPF wird aktualisiert, um auf den neuen Zweig zu verweisen, und alle neuen Commits werden auf dem neuen Zweig gespeichert. Sie können sich vorstellen, einen Zweig auszuchecken, als würden Sie zu einem neuen Projektordner wechseln. Es ist jedoch viel einfacher, Änderungen wieder in das Projekt zu übernehmen.


Verschiedene Zweige auschecken

Aus diesem Grund ist es in der Regel eine gute Idee sauber Arbeitsverzeichnis vor dem Auschecken einer Filiale. Ein sauberes Verzeichnis ist vorhanden, wenn keine nicht festgeschriebenen Änderungen vorhanden sind. Wenn dies nicht der Fall ist, git checkout hat das Potenzial, Ihre Änderungen zu überschreiben.

Bei einer "sicheren" Revision können Sie mit einem neuen Zweig experimentieren, ohne befürchten zu müssen, dass vorhandene Funktionen zerstört werden. Sie haben jetzt jedoch eine spezielle Historie, mit der Sie arbeiten können, sodass Sie den Fortschritt eines Experiments genau aufzeichnen können git add und git begehen Befehle von früher im Buch.


Mehrere Funktionen parallel entwickeln

Diese Funktionalität wird noch leistungsfähiger, wenn wir lernen, abweichende Historien wieder in den "Hauptzweig" (z., Meister). Wir werden gleich darauf eingehen, aber zuerst gibt es einen wichtigen Anwendungsfall von git checkout das muss bedacht werden ...

Freistehende Köpfe

Git lässt Sie auch verwenden git checkout mit Tags und Commit-IDs, aber dies versetzt Sie in eine abgetrennter HEAD-Zustand. Das bedeutet, dass Sie sich nicht mehr in einem Zweig befinden - Sie sehen direkt ein Commit.


Ein altes Commit auschecken

Sie können sich wie gewohnt umsehen und neue Commits hinzufügen. Da jedoch kein Zweig auf die Ergänzungen verweist, verlieren Sie Ihre gesamte Arbeit, sobald Sie wieder zu einem echten Zweig wechseln. Glücklicherweise erstellen Sie einen neuen Zweig in einem freistehenden KOPF Zustand ist leicht genug:

 git checkout -b 

Dies ist eine Abkürzung für Git-Zweig gefolgt von git checkout . Danach haben Sie einen glänzenden neuen Zweigverweis auf die zuvor freistehenden KOPF. Dies ist ein sehr praktisches Verfahren, um Experimente von alten Revisionen abzuwehren.


Zweige zusammenführen

Beim Zusammenführen werden Commits von einem Zweig in einen anderen gezogen. Es gibt viele Möglichkeiten, Zweige zu kombinieren, aber das Ziel ist immer, Informationen zwischen Zweigen auszutauschen. Dies macht das Zusammenführen zu einer der wichtigsten Funktionen von Git. Die zwei häufigsten Zusammenführungsmethoden sind:

  • Die "Schnellvorlauf" -Mischung
  • Die "3-Wege" -Mischung

Beide verwenden den gleichen Befehl, git merge, Die Methode wird jedoch automatisch basierend auf der Struktur Ihrer Historie festgelegt. In jedem Fall, Der Zweig, in den Sie einbinden möchten, muss ausgecheckt sein, und der Zielzweig bleibt unverändert. In den nächsten beiden Abschnitten werden zwei mögliche Zusammenführungsszenarien für die folgenden Befehle vorgestellt:

 git checkout master git einige Funktionen zusammenführen

Wieder verbindet dies die einige funktion verzweige in die Meister Zweig, der ehemalige bleibt unberührt. Sie führen diese Befehle normalerweise aus, wenn Sie eine Funktion abgeschlossen haben und sie in das Stable-Projekt integrieren möchten.

Schnellvorlauf-Zusammenführungen

Das erste Szenario sieht folgendermaßen aus:


Vor dem Schnellvorlauf

Wir haben einen Zweig für die Entwicklung einiger neuer Funktionen erstellt, zwei Commits hinzugefügt und können nun in die Hauptcodebasis integriert werden. Statt die beiden fehlgeschlagenen Commits neu zu schreiben Meister, Git kann das "vorspulen" Meister Der Zeiger des Zweigs, der der Position von entspricht einige funktion.


Nach dem Schnellvorlauf

Nach der Verschmelzung die Meister Verzweigung enthält den gesamten gewünschten Verlauf, und der Zweig der Funktion kann gelöscht werden (es sei denn, Sie möchten ihn weiterentwickeln). Dies ist die einfachste Art der Zusammenführung.

Natürlich hätten wir die beiden Commits direkt auf der Website machen können Meister Ast; Die Verwendung eines dedizierten Funktionszweigs bot uns jedoch eine sichere Umgebung, um mit neuem Code zu experimentieren. Wenn es sich nicht als richtig herausstellte, hätten wir den Zweig einfach löschen können (im Gegensatz zum Zurücksetzen / Zurücksetzen). Wenn wir eine Reihe von Zwischencommits mit gebrochenem Code hinzufügen, könnten wir den Code bereinigen, bevor er ihn einfügt Meister (siehe unten). Da Projekte immer komplizierter werden und mehr Mitarbeiter gewinnen, macht Git diese Art der verzweigten Entwicklung zu einem fantastischen Organisationswerkzeug.

3-Wege-Zusammenführungen

Aber nicht alle Situationen sind einfach genug für ein schnelles Vorwärtsgehen. Denken Sie daran, dass der Hauptvorteil von Branchen die Möglichkeit ist, viele unabhängige Entwicklungslinien gleichzeitig zu erkunden. Infolgedessen sehen Sie häufig ein Szenario, das wie folgt aussieht:


Vor dem 3-Wege-Zusammenführen

Dies begann wie eine Zusammenführung mit schnellem Vorlauf, aber wir haben ein Commit hinzugefügt Meister Zweig, während wir noch in der Entwicklung waren einige funktion. Wir hätten beispielsweise die Arbeit an der Funktion beenden können, um einen zeitkritischen Fehler zu beheben. Natürlich sollte der Bugfix so schnell wie möglich zum Haupt-Repository hinzugefügt werden, so dass wir in dem oben gezeigten Szenario landen.

Zusammenführen des Feature-Zweigs in Meister führt in diesem Zusammenhang zu einer "3-Wege" -Mischung. Dies geschieht mit den gleichen Befehlen wie beim Schnellvorlauf aus dem vorherigen Abschnitt.


Nach dem 3-Wege-Zusammenführen

Git kann das nicht vorspulen Meister Zeiger auf einige funktion ohne Backtracking. Stattdessen wird ein neues generiert Merge-Commit das ist die kombinierte Momentaufnahme beider Zweige. Beachten Sie, dass dieses neue Commit hat zwei Das übergeordnete Commit gibt ihm Zugriff auf beide Historien (in der Tat laufend) Git Log nach der 3-Wege-Zusammenführung zeigt Commits aus beiden Zweigen).

Der Name dieses Merge-Algorithmus stammt von der internen Methode, die zum Erstellen des Merge-Commits verwendet wurde. Git sieht zu drei verpflichtet sich, den Endzustand der Zusammenführung zu generieren.

Konflikte zusammenführen

Wenn Sie versuchen, zwei Verzweigungen zu kombinieren, die verschiedene Änderungen an demselben Codeteil vornehmen, kann Git nicht wissen, welche Version verwendet werden soll. Dies nennt man a Konflikt vermischen. Offensichtlich kann dies niemals während einer Schnellvorlauf-Zusammenführung passieren. Wenn Git auf einen Zusammenführungskonflikt stößt, wird folgende Meldung angezeigt:

 Automatisches Zusammenführen von index.html CONFLICT (Inhalt): Konflikt in zusammenführen  Automatische Zusammenführung fehlgeschlagen; Konflikte beheben und das Ergebnis festschreiben.

Anstatt das Merge-Commit automatisch hinzuzufügen, hält Git an und fragt Sie, was Sie tun sollen. Laufen Git-Status In dieser Situation wird etwas wie das Folgende zurückgegeben:

 # Auf Zweigmaster # Nicht zusammengeführte Pfade: # # Beide wurden geändert: 

Jede Datei mit einem Konflikt wird im Abschnitt "Nicht zusammengeführte Pfade" gespeichert. Git annotiert diese Dateien, um den Inhalt beider Versionen anzuzeigen:

 <<<<<<< HEAD This content is from the current branch. ======= This is a conflicting change from another branch. >>>>>>> einige Funktionen

Der Teil vor dem ======= ist aus dem Meister branch, und der Rest stammt von dem Zweig, den Sie integrieren möchten.

Um den Konflikt zu lösen, entfernen Sie die <<<<<<, =======, und >>>>>>> Notation, und ändern Sie den Code in das, was Sie behalten möchten. Dann sagen Sie Git, dass Sie den Konflikt mit gelöst haben git add Befehl:

 git add 

Stimmt; Alles, was Sie tun müssen, ist die in Konflikt stehende Datei in Szene zu setzen, um sie als aufgelöst zu markieren. Schließen Sie die 3-Wege-Zusammenführung ab, indem Sie das Zusammenführungs-Commit generieren:

 git begehen

Die Protokollnachricht enthält eine Zusammenführungsbenachrichtigung sowie eine Liste mit "Konflikten", die besonders nützlich sein kann, wenn Sie herausfinden möchten, wo in einem Projekt etwas schiefgelaufen ist.

Und das ist alles, was man in Git mischen kann. Nachdem wir nun die Mechanismen hinter Git-Zweigen verstanden haben, können wir uns eingehend damit beschäftigen, wie erfahrene Git-Benutzer Zweige in ihrem täglichen Arbeitsablauf nutzen.


Verzweigungsworkflows

Die in diesem Abschnitt vorgestellten Arbeitsabläufe sind das Markenzeichen der Git-basierten Revisionskontrolle. Da Gits Filialimplementierung leicht und einfach zusammenzuführen ist, ist Git eines der produktivsten Werkzeuge in Ihrem Softwareentwicklungsarsenal.

Alle verzweigten Workflows drehen sich um die Git-Zweig, git checkout, und git merge Befehle, die zuvor in diesem Kapitel vorgestellt wurden.

Arten von Zweigen

Es ist oft nützlich, verschiedenen Zweigen eine spezielle Bedeutung zu geben, um ein Projekt zu organisieren. In diesem Abschnitt werden die gebräuchlichsten Arten von Verzweigungen vorgestellt. Beachten Sie jedoch, dass diese Unterschiede rein vordergründig sind. Git ist eine Verzweigung.

Alle Zweige können als kategorisiert werden permanent Geäst oder Zweigzweige. Ersteres enthält die Hauptgeschichte eines Projekts (z., Meister), während letztere temporäre Zweige sind, die zur Implementierung eines bestimmten Thema, dann verworfen (z., einige funktion).

Dauerhafte Niederlassungen

Permanente Niederlassungen sind das Lebenselixier eines Endlagers. Sie enthalten alle wichtigen Wegpunkte eines Softwareprojekts. Die meisten Entwickler verwenden Meister ausschließlich für stabilen Code. In diesen Workflows können Sie noch nie direkt begehen Meister-Es ist nur ein Integrationszweig für abgeschlossene Funktionen, die in speziellen Zweigzweigen erstellt wurden.

Darüber hinaus fügen viele Benutzer eine zweite Abstraktionsebene in einem anderen Integrationszweig hinzu (herkömmlich als bezeichnet) entwickeln, aber jeder Name wird ausreichen). Das macht das frei Meister Zweig für Ja wirklich stabiler Code (z. B. öffentliche Commits) und Verwendungen entwickeln als interner Integrationszweig zur Vorbereitung auf eine öffentliche Veröffentlichung. Das folgende Diagramm zeigt beispielsweise mehrere Funktionen, die in integriert sind entwickeln, dann eine einzige, endgültige Verschmelzung Meister, was eine öffentliche Veröffentlichung symbolisiert.


Verwendung der Meister Zweig ausschließlich für öffentliche Veröffentlichungen

Zweigzweige

Themenzweige lassen sich im Allgemeinen in zwei Kategorien einteilen: Feature-Zweige und Hotfix-Zweige. Feature-Verzweigungen sind temporäre Verzweigungen, die ein neues Feature oder einen neuen Refactor einkapseln und das Hauptprojekt vor nicht getestetem Code schützen. Sie stammen in der Regel aus einem anderen Funktionszweig oder einem Integrationszweig, nicht jedoch aus dem "superstabilen" Zweig.


Entwickeln einer Funktion in einer isolierten Zweigstelle

Hotfix-Zweige sind von Natur aus ähnlich, stammen jedoch aus dem öffentlichen Veröffentlichungszweig (z., Meister). Anstatt neue Funktionen zu entwickeln, dienen sie zum schnellen Patchen der Hauptentwicklungslinie. In der Regel bedeutet dies Fehlerbehebungen und andere wichtige Updates, die nicht bis zur nächsten Hauptversion warten können.


Patchen Meister mit einem Hotfix-Zweig

Wiederum sind die Bedeutungen, die jedem dieser Zweige zugewiesen werden, rein konventionell - Git sieht keinen Unterschied zwischen Meister, entwickeln, Features und Hotfixes. Fürchte dich nicht davor, sie an deine eigenen Zwecke anzupassen. Das Schöne an Git ist seine Flexibilität. Wenn Sie die Mechanismen von Git-Filialen verstehen, können Sie ganz einfach neue Workflows entwerfen, die zu Ihrem Projekt und Ihrer Persönlichkeit passen.


Neueinstellung

Neueinstellung ist der Vorgang, bei dem ein Zweig zu einem neuen verschoben wird Base. Die Umbasierungsfunktionen von Git machen die Filialen noch flexibler, da Benutzer ihre Filialen manuell organisieren können. Wie das Zusammenführen, Git Rebase erfordert, dass der Zweig ausgecheckt ist, und nimmt die neue Basis als Argument an:

 git checkout git rebase master mit einigen Funktionen

Das bewegt das Ganze einige funktion Verzweigen Sie auf die Spitze von Meister:


Neueinstellung einige funktion auf die Meister Ast

Nach der Neubasis ist der Funktionszweig a lineare Ausdehnung von Meister, Dies ist eine viel sauberere Möglichkeit, Änderungen von einem Zweig in einen anderen zu integrieren. Vergleichen Sie diese lineare Geschichte mit einer Verschmelzung von Meister in einige funktion, was genau die gleiche Codebasis im letzten Snapshot ergibt:


Integrieren Meister in einige funktion mit einer 3-Wege-Verbindung

Da die Geschichte auseinandergegangen ist, muss Git ein zusätzliches Merge-Commit verwenden, um die Zweige zu kombinieren. Wenn Sie dies während der Entwicklung einer langwierigen Funktion viele Male ausführen, kann dies zu einer sehr unordentlichen Geschichte führen.

Diese zusätzlichen Merge-Commits sind überflüssig - sie existieren nur, um Änderungen herbeizuführen Meister in einige funktion. Normalerweise möchten Sie, dass Ihre Zusammenführungs-Commits ausgeführt werden bedeuten so etwas wie die Fertigstellung einer neuen Funktion. Aus diesem Grund ziehen viele Entwickler Änderungen mit ein Git Rebase, da dies zu einer vollständig linearen Historie im Feature-Zweig führt.

Interaktives Neuanstellen

Interaktives Umbasieren geht noch einen Schritt weiter und ermöglicht es Ihnen Veränderung begeht, wenn Sie sie auf die neue Basis verschieben. Mit können Sie eine interaktive Basis festlegen -ich Flagge:

 Git rebase -i Meister

Dies füllt einen Texteditor mit einer Zusammenfassung jedes Commits im Feature-Zweig sowie einem Befehl, der bestimmt Wie es sollte auf die neue Basis übertragen werden. Wenn Sie beispielsweise zwei Commits für einen Feature-Zweig haben, können Sie eine interaktive Basisstation wie folgt angeben:

 pick 58dec2a Erstes Commit für neues Feature squash 6ac8a9f Zweites Commit für neues Feature

Der Standard auswählen Der Befehl verschiebt den ersten Commit wie üblich auf die neue Basis Git Rebase, aber dann die quetschen Befehl befiehlt Git, das zweite Commit mit dem vorherigen zu kombinieren, so dass Sie ein Commit mit all Ihren Änderungen erhalten:


Interaktiv den basen ändern einige funktion Ast

Git bietet mehrere interaktive Umbasierungsbefehle, von denen jeder im Kommentarabschnitt der Konfigurationsliste zusammengefasst ist. Der Punkt ist interaktives Umbasieren lässt Sie vollständig Schreiben Sie die Historie einer Branche nach Ihren genauen Vorgaben. Dies bedeutet, dass Sie beliebig viele Zwischen-Commits zu einem Feature-Zweig hinzufügen können. Anschließend können Sie zurückgehen und sie anschließend in einen sinnvollen Verlauf bringen.

Andere Entwickler werden denken, dass Sie ein brillanter Programmierer sind und genau wissen, wie Sie das gesamte Feature auf einen Schlag implementieren können. Diese Art der Organisation ist sehr wichtig, um sicherzustellen, dass große Projekte eine navigierbare Geschichte haben.

Historie neu schreiben

Die Neueinstellung ist ein mächtiges Werkzeug, aber Sie müssen beim Umschreiben der Geschichte umsichtig sein. Beide Arten der Umbasierung finden eigentlich nicht statt Bewegung bestehende Zusagen erstellen brandneue (im obigen Diagramm durch ein Sternchen gekennzeichnet). Wenn Sie Commits überprüfen, die einer Rebase unterzogen wurden, werden Sie feststellen, dass sie unterschiedliche IDs haben, obwohl sie denselben Inhalt repräsentieren. Dies bedeutet Umbasierung zerstört Bestehende Commits im Prozess des "Verschiebens".

Wie Sie sich vorstellen können, hat dies dramatische Folgen für kollaborative Workflows. Zerstörung eines öffentlichen Commits (z. B. irgendetwas auf der Meister Niederlassung) ist, als würde man die Grundlage der Arbeit aller anderen ausreissen. Git hat keine Ahnung, wie man die Änderungen aller zusammenbringt, und man muss sich sehr entschuldigen. Wir werden dieses Szenario eingehender betrachten, nachdem wir gelernt haben, wie Sie mit entfernten Repositorys kommunizieren.

Halten Sie sich zunächst an die goldene Regel der Umbasierung: Verändern Sie niemals einen Zweig, der in ein öffentliches Repository verschoben wurde.

Diese Lektion repräsentiert ein Kapitel aus Git Erfolgreich, ein kostenloses eBook aus dem Team von Syncfusion.