Git Blog

Arbeiten mit Branches

Hier wird gezeigt wie man einen Branch erstellt und Änderungen aus dem Branch in den Hauptstrang (master) überträgt (Merge).

Inhalt:

Create Branch

Um einen neuen Branch zu erstellen wählen wir 'master' in der 'Git Repository Exploring' Perspektive an: Rechtsklick>Create Branch. Wir geben dann den Branchnamen ein.

Der neue Branch wurde nun lokal angelegt und ist nun auch direkt aktiv.

TIPP
Über Rechtsklick>Checkout kann man pfeilschnell zwischen Branches hin- und herwechseln (wenn es keine zu commitenden Änderungen gibt).

Java Perspektive. Alle Klassen und Methoden werden nun mit Kommentaren versehen. Die geänderten Dateien werden mit ">" dekoriert.

Es wird nun der schnelle Weg gezeigt. Wir wählen pro1 und pro2 und wählen Team>Commit. Mit der Option 'Push the changes to upstream' wird nicht nur committet, sondern direkt auch in das Server-Repository gepusht.

Nach dem Pushen wird wie immer eine Bestätigung angezeigt.

In der 'Git Repository Exploring' Perspektive wird es - ggf. nach einem Refresh - so angezeigt:

pro-repo: Kein Hochpfeil. Es gibt nichts zu pushen. Dies liegt daran, dass wir Commit+Push in einem durchgeführt haben.

Während der master noch 'Willkommen!' als letzten Commit anzeigt, hat der kommentare-Branch schon den Commit 'Kommentare'. Die Remote Tracking Branches weisen den gleichen Commit auf. Dies zeigt an, dass das Workspace und Server-Repository derzeit übereinstimmen.

Mergen

Wir wollen nun die Änderungen aus Branch 'kommentare' in den master mergen. Es muss immer der Branch aktiv sein, in den hinein gemerget werden soll. Also wählen wir master per Rechtsklick>Checkout. Der master erhält nun den schwarz-weißen Haken. Auf dem master wählen wir dann Merge aus dem Kontextmenü. Hier ist es wichtig, den gewünschten Branch aus Local zu wählen. Merge.

Es wird ein Bestätigungsdialog angezeigt:

Der master hat nun auch 'Kommentare' als letzten Commit und es gibt eine 'Hochpfeil 1' Dekoration. Es muss also noch gepusht werden.

Nach pro-repo -> 'Push to Upstream' wird wieder ein Bestätigungsdialog angezeigt:

Die 'Hochpfeil 1' Dekoration verschwindet und 'Remote Tracking > origin/master' hat nun auch 'Kommentare' als letzten Commit. Das Mergen ist nun fertig und wurde vollautomatisch vollzogen.

Merge Konflikt

Das Mergen funktioniert fast immer vollautomatisch. Eine große Stärke von Git! Auch wenn zwei Committer jeweils unterschiedliche Methoden an unterschiedlichen Stellen hinzugefügt haben. Falls die gleiche Codezeile von verschiedenen Committern geändert worden ist, wird das Mergen unterbrochen. Die Datei enthält nun beide Zustände mit Trennlinien. Es muss nun von Hand gemerget werden. Anschließend ist 'Add to Index' zu wählen, damit der Merge-Prozess fortgeführt wird.

Remote Branch auschecken

Wenn nun Otto das Git Repository clonen würde, würde er neben dem master auch den 'kommentare'-Branch vorfinden. Allerdings ist dieser unter 'Local' nicht auscheckbar.

Auf pro-repo wählt man nun im Kontextmenü Switch to > New Branch. In der Combobox wählt man dann 'refs/remotes/origin/kommentare'. Finish.

TIPP
Es macht vermutlich Sinn die Pull Strategy 'Rebase' zu wählen. Ich habe es noch nicht ausprobiert. Dadurch müssten dann die sog. Diamantenketten beim Pull vermieden werden.

Der Branch ist nun unter 'Local' verfügbar und aktiv. Ab sofort kann dieser Branch lokal geändert werden und die Änderungen committet und gepusht werden.

Tipp: Hochpfeil Dekoration wird nicht angezeigt

Wenn die Hochpfeil Dekoration nicht funktioniert, ist in der 'Git Repository Exploring' Perspektive der Branch mittels Rechtsklick>Confige Branch zu ändern. Unter Upstream Branch ist 'refs/heads/kommentare' und unter Remote stets 'origin' einzutragen. Wenn die Hochpfeil Dekoration nicht funktioniert, waren diese beiden Felder leer.

Tipp: Codeänderung rückgängig machen

Hier beschreibe ich kurz wie man eine Dateiänderung rückgängig machen kann. Und zwar wurde in diesem Fall noch nicht committet. Also auch nicht gepusht. Man wählt einfach im Kontextmenü der Datei: 'Replace with>HEAD Revision'.

HEAD ??
Man darf sich hier nicht von dem Begriff 'HEAD' irritieren lassen. Mit HEAD ist nicht der CVS "HEAD" bzw. der Git "master" gemeint. In Git ist der HEAD der letzte Commit des (lokalen) Branches.

Tipp: Commit rückgängig machen

Wenn man versehentlich etwas committet hat, es aber noch nicht gepusht hat, kann man es rückgängig machen. Man holt sich einfach die Änderung vom Server Repository.

Reset HARD
Man wählt das Projekt in der Java Perspektive an und wählt im Kontextmenü Team>Reset. Hier wählt man (und das ist jetzt der Clou:) unter 'Remote Tracking' den entsprechenden Branch. Unten wählt man die Option 'HARD (HEAD, index, and working directory updated)'. Nun klickt man auf den Button Reset und die Hochpfeil Dekoration im Package Explorer verschwindet. Der Branchzeiger wurde einen zurück gesetzt. Der alte, fehlerhafte Commit ist noch da, verschwindet aber irgendwann. Die Dateien im Workspace haben nun wieder den alten Stand. Dies funktioniert natürlich nur astrein, wenn sich das Remote Repository zwischenzeitlich nicht weiterentwickelt hat.

Rebase rückgängig machen
Obiges Verfahren funktioniert auch für einen Rebase - eben solange das Rebase-Ergebnis noch nicht gepusht wurde.

Merke: Merge & Rebase

Merge
Es muss der Branch aktiv sein, in dem rein gemerget werden soll. Dies ist meist master. Darein soll der Feature-Branch gemerget werden. master ist dann aktiv. Man wählt Merge und den reinzumergenden Branch (aus dem 'Local' Ast), eben den Feature-Branch.

Glatte Historie mit Rebase
Der Feature-Branch soll auf den master rebaset werden. Hier muss dann der Feature-Branch aktiv sein. Man wählt Rebase und dann master. Hier ist es also andersrum; der Feature-Branch ist der aktive.

weiter mit "Git im Team" >>