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 -m einen Branch umbenennen; mittels -M auch mit überschreiben

  • mit -d einen Branch löschen; mittels -D auch wenn ggf. noch Dinge uncommited oder unveröffentlicht

  • mit -f den 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.