Branches und Checkouts¶
Immer wieder und bitte niemals vergessen, dass wir im Grunde Referenzen anwenden und nutzen.
In einfachster Form erstellt man mit git branch newbranch
einen neuen Zweig.
Namenskonventionen:
komplett in Kleinbuchstaben; Standardbez.: master, maint, next
Nutzung von Namespaces; z.B. i18n/german, username/hishertesting, pu/feature (proposed updates), ..
Diesen Zweig nutzen wir mit git checkout newbranch und lassen
uns die Branches mit git branch anzeigen.
Das Ganze gibt es auch als Einzeiler: git checkout -b newbranch
(erstellen und gleich checkout)
Das entspricht den Aufrufen:
git branch newbranch && git checkout newbranch
Test/Übung: git checkout -b testbranch und gleich mal HEAD checken
$ cat .git/HEAD
ref: refs/heads/testbranch
Übung: wir erstellen mal eine neue Datei testbranch/branchdatei.txt
und ändern eine bestehede Datei.
Danach alles adden und committen…
Wir wechseln also mit git checkout zwischen Branches
(indem Referenzen umgehängt werden). Der Wechsel wird immer vollzogen,
sofern keine Datenverluste oder Datenüberschreibungen stattfinden!
Es kommt zu Checkout-Meldungen, falls solche Datenverluste drohen!
Szenarien:
Checkout überschreibt Datei im Working Tree, in der sich aktuell Änderungen befinden
Checkout überschreibt eine (noch) ungetrackte (Git unbekannte) Datei
Hier kann (oder besser: könnte) man die Änderungen
mit Schalter -f forcieren!
Andere git branch-Kommandos:
mit
-meinen Branch umbenennen; mittels-Mauch mit überschreibenmit
-deinen Branch löschen; mittels-Dauch wenn ggf. noch Dinge uncommited oder unveröffentlichtmit
-fden gewünschten checkout erzwingen; bitte sicher sein, dass Aktion so gewünscht
git checkout
Das Kommando kann auch ältere Versionen von Dateien wiederherstellen:
git checkout sha1summe -- datei.ext
Die -- sind hier als Trenner sinnvoll. Wenn man sich die Dateiinhalte
vorher sichtbar machen möchte, dann hilft: git show sha1summe:datei.ext
Für dieses checkout existiert ein Schalter --patch
(also der interaktive Modus).
Detached Head
Wenn man sich einfach einen kompletten Zustand (sprich: Commit) manuell auscheckt, dann existiert kein Branch und somit auch kein HEAD, #der auf einen Branch referenziert. Das wird durch entsprechende Rückmeldungen von Git zum Ausdruck gebracht.
$ git checkout 67e4ee1
Note: checking out '67e4ee1'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
HEAD is now at 67e4ee1 Set theme jekyll-theme-cayman
Hier mal Infos zum HEAD:
$ cat .git/HEAD
67e4ee15514d428d3de4b8d5db190f04b9d79ee9
Anwendungsbeispiel für Detached Heads:
Mit dieser Technik, kann man schauen, wie das Projekt aussah
und natürlich ließe sich jetzt auch mit git checkout -b neuerbranchname
ein eigenständiger neuer Branch erzeugen.