Lab 15: Cherry-Pick (Terminal)¶
Manchmal möchtest du nicht einen ganzen Branch mergen, sondern nur bestimmte
Commits aus einem anderen Branch übernehmen. Genau dafür gibt es
git cherry-pick. Der Befehl nimmt einen oder mehrere Commits und wendet sie
als neue Commits auf den aktuellen Branch an.
Ein typischer Anwendungsfall: Ein Bugfix wurde auf einem Feature-Branch gemacht,
muss aber auch sofort auf master übernommen werden, ohne den ganzen
Feature-Branch zu mergen.
Vorbereitung¶
Öffne das Terminal im Verzeichnis labs/15-basic-cherry-pick/exercise.
Ausgangssituation¶
Das Repository hat folgende Struktur:
A - B - C - D master
\
E - F - G - H feature
Die Commits F und G enthalten Änderungen, die wir auf master haben
wollen - aber nicht die Commits E und H. Ziel ist:
A - B - C - D - F' - G' master
\
E - F - G - H feature
Aufgaben¶
Ausgangszustand erkunden¶
- Schau dir die gesamte Historie an:
git log --oneline --graph --all - Finde heraus, welche Dateien in den Commits
FundGgeändert wurden:cat names.txt- diese Datei wird in CommitFgeändertcat sentence.txt- diese Datei wird in CommitGgeändert
Einen einzelnen Commit cherry-picken¶
- Cherry-picke den Commit
F:
git cherry-pick <sha-von-F>
- Prüfe die Historie:
git log --oneline. Der CommitFsollte jetzt als neuer Commit aufmastererscheinen. - Prüfe den Inhalt von
names.txt- die Änderung ausFist jetzt aufmaster.
Zurücksetzen und Bereich cherry-picken¶
- Mache den Cherry-Pick rückgängig, um die Variante mit einem Commit-Bereich auszuprobieren:
git reset --hard HEAD^
HEAD^bedeutet: ein Commit vor dem aktuellen Commit.
-
Prüfe mit
git log --oneline --graph, dass der Cherry-Pick entfernt wurde. -
Cherry-picke nun einen Bereich von Commits (F bis G):
git cherry-pick <sha-von-F>^..<sha-von-G>
Wichtig: Das
^nach dem ersten SHA ist entscheidend! Die BereichsnotationA..Bschließt den CommitAstandardmäßig aus. MitA^..Bsagst du Git: "Nimm den Commit vor A als Startpunkt" - damit wird A eingeschlossen.
- Prüfe die Historie:
git log --oneline --graph - Prüfe den Inhalt von
names.txtundsentence.txt- beide Änderungen sollten jetzt aufmastersein.
Merke: Cherry-Pick erstellt neue Commits mit neuen Hashes. Die ursprünglichen Commits auf dem Feature-Branch bleiben unverändert. Das bedeutet auch: Wenn du den Feature-Branch später komplett mergst, können doppelte Änderungen auftauchen - Git kann das in der Regel aber automatisch erkennen und auflösen.
Nützliche Befehle¶
| Befehl | Beschreibung |
|---|---|
git cherry-pick <sha> |
Einzelnen Commit übernehmen |
git cherry-pick <sha1>^..<sha2> |
Bereich von Commits übernehmen (inklusive sha1) |
git reset --hard <ref> |
Branch auf einen Commit zurücksetzen |
git log --oneline --graph --all |
Gesamte Historie anzeigen |