02 Übung: Git Pointer und Branches
Anleitung
Dieses interaktive Quiz testet dein Verständnis von Git Branches als Pointer. Jede Frage zeigt einen Git-Graphen mit Commits, Branches, HEAD und/oder Tags. Studiere jeden Graphen sorgfältig, bevor du deine Antwort auswählst.
Abgedeckte Themen:
- Branch-Erstellung und -Wechsel
- Wie HEAD, Branches und Tags als Pointer funktionieren
- Fast-Forward-Merges und divergierende Branches
- Detached HEAD-Zustand
- Remote-Tracking Branches und Aufräum-Workflows
Jede Frage hat genau eine richtige Antwort. Konzentriere dich darauf zu verstehen, was die Pointer dir über den Git-Zustand verraten.
Du bist auf dem main Branch und führst git checkout -b feature/new-ui aus. Wie sieht der Git-Graph unmittelbar nach diesem Befehl aus?
Vorher:
"Add login" "Fix bug" "Add dashboard"
↓ ↓ ↓
a1b2c3d ← e4f5g6h ← i7j8k9l
↑
main ← HEAD
Nachdem du feature/new-ui erstellt hast, machst du einen Commit. Wie sieht der Graph aus?
Vor dem Commit:
a1b2c3d ← e4f5g6h ← i7j8k9l
↑
main
feature/new-ui ← HEAD
Du machst zwei weitere Commits auf feature/new-ui. Wie ist der Zustand jetzt?
Ausgangszustand:
a1b2c3d ← e4f5g6h ← i7j8k9l ← p9q8r7s
↑ ↑
main feature/new-ui ← HEAD
Nach 2 weiteren Commits:
Du führst git checkout main aus. Was passiert mit den Pointern?
Vor dem Checkout:
a1b2c3d ← e4f5g6h ← i7j8k9l ← p9q8r7s ← t1u2v3w ← x4y5z6a
↑ ↑
main feature/new-ui ← HEAD
Während du auf main bist, führst du git merge feature/new-ui aus und Git führt einen „Fast-Forward”-Merge durch. Was ist das Ergebnis?
Vor dem Merge:
a1b2c3d ← e4f5g6h ← i7j8k9l ← p9q8r7s ← t1u2v3w ← x4y5z6a
↑ ↑
main ← HEAD feature/new-ui
Nach dem Merge erstellst du einen Tag: git tag -a v1.0 -m "Release 1.0". Wohin zeigt der Tag-Pointer?
Vor dem Tag:
a1b2c3d ← e4f5g6h ← i7j8k9l ← p9q8r7s ← t1u2v3w ← x4y5z6a
↑
main ← HEAD
feature/new-ui
Du wechselst zu main und machst einen Commit. Währenddessen bleibt feature/new-ui wo es ist. Wie ist der Zustand?
Ausgangszustand:
a1b2c3d ← e4f5g6h ← i7j8k9l ← p9q8r7s ← t1u2v3w ← x4y5z6a
↑
main ← HEAD
feature/new-ui
(v1.0)
Danach: git checkout main, dann einen Commit machen
Ausgehend vom Ergebnis aus Frage 7 wechselst du jetzt zu feature/new-ui und machst einen neuen Commit. Wie sieht das Repository aus?
Ausgangszustand (von F7):
a1b2c3d ← e4f5g6h ← i7j8k9l ← p9q8r7s ← t1u2v3w ← x4y5z6a ← b7c8d9e
↑ ↑
(v1.0) main ← HEAD
feature/new-ui
Ausgeführte Befehle:
git checkout feature/new-ui
echo "new feature code" >> app.js
git add app.js
git commit -m "Add new UI feature"
Was ist das Ergebnis?
Du führst git checkout x4y5z6a aus (den Commit mit Tag v1.0). In welchem Zustand befindet sich Git?
Vor dem Checkout:
b7c8d9e
↑
main ← HEAD
/
a1b2c3d ← e4f5g6h ← i7j8k9l ← p9q8r7s ← t1u2v3w ← x4y5z6a ←
↑ \
(v1.0) f1g2h3i
↑
feature/new-ui
Du benennst einen Branch um mit git branch -m old-name new-name. Was ändert sich tatsächlich?
Vor der Umbenennung:
↱ b7c8d9e
/ ↑
a1b2c3d ← e4f5g6h ← i7j8k9l ← p9q8r7s ← t1u2v3w ← x4y5z6a main
↑ ↖
(v1.0) f1g2h3i
↑
feature/old-name ← HEAD
Du führst git branch -a aus und siehst diese Ausgabe. Welche drei Arten von Referenzen werden angezeigt?
$ git branch -a
main
feature/new-feature
remotes/origin/main
remotes/origin/feature/old-pr
Du führst git fetch origin aus. Was aktualisiert dieser Befehl?
Vor dem Fetch:
GitHub (origin):
main → x4y5z6a (neuester Commit)
Dein lokales Git:
main → i7j8k9l (veraltet)
remotes/origin/main → i7j8k9l (veraltetes Lesezeichen)
Nach dem Fetch:
Ein PR wurde gemergt und der Feature-Branch wurde auf GitHub gelöscht. Du führst lokal git branch -a aus. Was siehst du?
GitHub (origin):
main (einziger Branch, der existiert)
Dein lokales Git hat noch nicht gefetcht:
Was macht git fetch --prune anders als git fetch?
Situation:
- GitHub hat feature/old-pr gelöscht
- Dein lokales Git hat noch remotes/origin/feature/old-pr
Du führst aus: git fetch --prune
Du hast gerade einen PR auf GitHub gemergt und der Feature-Branch wurde automatisch gelöscht. Du führst git checkout main aus, dann git pull --prune. Was passiert?
Vorher:
GitHub: main → x4y5z6a (hat gemergten PR)
feature/old-pr gelöscht
Lokal: main → i7j8k9l (veraltet)
feature/old-pr → p9q8r7s (existiert lokal noch)
remotes/origin/main → i7j8k9l (veraltet)
remotes/origin/feature/old-pr → p9q8r7s (veraltet!)
Nach git pull --prune:
Was stellen Remote-Tracking Branches laut der „Lesezeichen-Analogie” aus der Vorlesung dar?
GitHub (die Websites) hat:
- main Branch
- feature/xyz Branch
Dein lokales Git hat:
- Lokale Branches (main, feature/xyz)
- Remote-Tracking Branches (remotes/origin/main, remotes/origin/feature/xyz)
Du möchtest, dass Git bei jedem Fetch automatisch veraltete Remote-Tracking Branches entfernt. Was solltest du konfigurieren?
Du möchtest sehen, welche lokalen Branches in main gemergt wurden, bevor du sie löschst. Welcher Befehl zeigt das an?
Dein PR wurde mit „Squash and merge” auf GitHub gemergt. Der Branch wurde dort gelöscht. Jetzt versuchst du, deinen lokalen Branch zu löschen:
$ git branch -d feature/squashed
error: The branch 'feature/squashed' is not fully merged.
Warum sagt Git das, und was solltest du tun?
Dein PR wurde mit „Create a merge commit” (nicht Squash) gemergt und GitHub hat den Remote-Branch automatisch gelöscht. Wie sieht der komplette Aufräum-Workflow aus?
Ausgangszustand:
- GitHub: main (aktualisiert mit deinem PR per Merge-Commit), feature/xyz gelöscht
- Lokal: main (veraltet), feature/xyz (existiert noch),
remotes/origin/feature/xyz (veraltet)