11.1 Branches in Git
Arbeiten mit Branches in Git — das ist einer der Schlüsselkonzepte des Version Control Managements, der es ermöglicht, parallel mehrere Entwicklungsstränge in einem Repository zu führen. Branching macht Git zu einem mächtigen Tool für Zusammenarbeit, Experimente und das Management verschiedener Projektversionen.
Du kannst dir Branches in Git wie Ordner vorstellen, in die Git dein Projekt kopiert. Du hast den Hauptordner deines Projekts in deinem lokalen Repository — master, und Git kann Kopien dieses Ordners erstellen, damit du dort experimentieren kannst, ohne den Hauptcode, der gut funktioniert, zu beschädigen. Solche Ordnerkopien nennt man Branches.
Branches sind alternative Codeversionen. Angenommen, du möchtest etwas in einem großen Projekt ändern, ein Experiment durchführen, bei dem du dir nicht ganz sicher bist. Wie würdest du das ohne Git machen?
Man könnte das Projekt in einen neuen Ordner kopieren und versuchen, alles dort zu ändern. Wenn dir das Ergebnis gefällt, kannst du es in den Hauptordner kopieren. Wenn nicht, kannst du es vergessen oder sogar löschen.
Oder nehmen wir ein Beispiel aus dem echten Leben. Sagen wir, beim Schreiben eines Buches:
- Du hast ein Manuskript des Buches (Hauptbranch).
- Du willst das Ende ändern (erstellen eines neuen Branches).
- Du schreibst ein neues Ende in ein separates Dokument (Arbeiten im neuen Branch).
- Wenn das neue Ende besser ist, ersetzt du das alte im Manuskript (Branch Merge).
- Löschst das separate Dokument mit dem neuen Ende (Branch löschen).
11.2 Erstellen von Branches
Ein Branch in IntelliJ IDEA zu erstellen ist ganz einfach:
Gib den Namen des Branches ein:
IntelliJ IDEA zeigt dir sofort den Namen deines aktuellen Branches oben im Menü an:
Was war dort vorher?
Dort war der Name deines ersten und Hauptbranches — master.
Jetzt steht dort test, was bedeutet, dass Git (unter der Leitung von IntelliJ IDEA) nicht nur einen neuen Branch erstellt hat, sondern auch sofort zu ihm gewechselt ist.
Lass uns in der Datei main.html im aktuellen Branch (test) etwas Code hinzufügen und committen:
11.3 Wechseln zwischen Branches
Schritt 1. Wähle einen Branch aus.
Jetzt wechseln wir zu unserem alten Branch zurück. Klicke auf das obere Menü, und was sehen wir dort?
Keine Panik — es ist alles ganz einfach:
Local — das ist die Liste der Branches in deinem lokalen Git-Repository. Es gibt zwei davon:
- test
- master
Remote — das ist dein Remote-Repository, das sich auf einem Server von GitHub befindet. Wir haben deine Änderungen dorthin gepusht, aber der neue Branch ist dort nicht vorhanden, was logisch ist. Das Remote-Repository trägt den Namen origin und dort gibt es nur den Branch master.
Recent — das ist einfach eine Liste der Namen der letzten Branches, mit denen du gearbeitet hast: diesen Punkt fügt IntelliJ IDEA zur Bequemlichkeit und Schnelligkeit hinzu.
Der Name origin/master rechts vom lokalen Repository-Namen ist der Name des Remote-Repositories, mit dem es jetzt synchronisiert ist und wohin die Änderungen gepusht werden.
Schritt 2. Lade den Code des Branches in den aktuellen Ordner.
Schritt 3. Überprüfen.
Ich sehe den Branch „master“ und den alten Code:
11.4 Branch Merging
Versuchen wir nun, den Code unserer zwei Branches zusammenzuführen.
Schritt 1. Zuerst fügen wir unserem Projekt eine weitere Datei hinzu — index.html und schreiben dort irgendeinen Code:
- Datei index.html erstellen
- Schreibe darin den Code <h1>Hello</h1>
- Datei committen
So sehen meine zwei Dateien im Branch master aus:
Schritt 2. Branch Merging.
Wir werden die Änderungen, die im Branch test gemacht wurden, in unseren aktuellen Branch (master) einfließen lassen.
Dazu benutzen wir ebenfalls das obere Menü und den Befehl „Merge ‘test’ into ‘master’“:
Schritt 3. Ergebnis überprüfen.
Überprüfen:
- Oben wird immer noch der Branch master angezeigt
- Wir haben 2 Dateien: index.html und main.html
- Die Datei main.html enthält den Code, der im Branch test hinzugefügt wurde
11.5 Merge-Konflikte
Manchmal gibt es beim Mergen von Branches Konflikte.
Wenn du in verschiedenen Branches Änderungen an einer Datei vornimmst und versuchst, sie zu mergen, kann es zu einem Konflikt kommen.
Konflikt in Textdateien
Git — das ist ein sehr intelligentes System — erkennt Dateitypen. Wenn du Änderungen an verschiedenen Stellen einer Datei machst, die es als Textdatei betrachtet, wird es die Änderungen einfach von einer Datei in die andere an die richtige Stelle übertragen (so, wie es ein Mensch tun würde).
Konflikt in Binärdateien
Wenn du jedoch irgendwo ein Bild oder ein Dokument änderst, wird Git nicht versuchen, dessen Teile zu einem zusammenzufügen: es wird dir einfach vorschlagen, welche Version der Datei du im aktuellen Branch behalten möchtest.
Manuelle Konfliktlösung
Wenn du Änderungen an derselben Stelle einer Textdatei vornimmst, wird Git nicht in der Lage sein, die verschiedenen Versionen korrekt zu mergen und dir vorschlagen, es selbst zu tun:
So könnte es aussehen:
Was du hier siehst:
- Links — der Inhalt der Datei main.html im Branch master
- Rechts — der Inhalt der Datei main.html im Branch test
- In der Mitte schlägt dir IntelliJ IDEA vor, die finale Version des Codes zu schreiben (du kannst auf die Tasten „>>“ und „<<“ klicken, um Änderungen aus einer Datei automatisch einzufügen)
Ich habe die Variante master angenommen und den Code manuell ergänzt. Hier ist, was ich bekommen habe:
11.6 Änderungsverlauf
Noch etwas Nützliches und Interessantes. Du kannst den Änderungsverlauf jeder Datei ansehen, indem du auf die Schaltfläche „Show History“ klickst. Es gibt zwei Stellen, wo er sich befinden kann. Finde sie.
So sieht der Änderungsverlauf bei mir für die Datei main.html aus:
Erklärungen:
-
Links siehst du den Änderungsverlauf der einzelnen Datei:
- Je neuer die Änderung, desto höher ist sie, je älter – desto niedriger
- Hier wird auch der Verlauf der Branch-Merges angezeigt
- Rechts — die Änderungen, die im jeweiligen Commit vorgenommen wurden
GO TO FULL VERSION