Orphan branch – komu to potrzebne? A dlaczego?

Orphan (sierota) branch jest to specyficzny rodzaj brancha. Znajduje się on w naszym repozytorium, ale może on mieć całkowicie inną historię niż pozostałe branche.
Historia commitów – krótkie przypomnienie
Jak wszyscy wiemy tworząc nowe repozytorium, tworzy Nam się od razu nowy branch o nazwie master. Pierwszy commit jest specjalny, ponieważ nie posiada żadnego rodzica. Jest to tak zwany root commit. Wszystkie następne commity będą miały jakiegoś rodzica.
Większość commitów będzie miało tylko jednego rodzica, a bardzo mała liczba commitów będzie miała 2 rodziców. Chodzi o commity powstałe po operacji merge. Teoretycznie jeden commit może mieć nieskończenie wiele rodziców.

Co to jest orphan branch?
Orphan branch jest to branch z całkowicie nową historią. Tworząc go, jego historia będzie pusta. Pierwszy commit, który zostanie na nim zrobiony będzie jego root commitem.
Zastosowanie w praktyce
W tym momencie widzę 2 zastosowania takiego brancha:
- Tworzenie dokumentacji czy stronki WWW dla naszego projektu (np. korzystając z GitHub Pages), aby trzymać je w tym samym repozytorium, ale nie mieszać jej z kodem źródłowym projektu.
- Połączenie dwóch nie powiązanych ze sobą repozytoriów z różną historią.
Pierwszy przypadek zastosowania jest jasny, nie będę go więcej tłumaczył. W drugim chodzi o to, że w gicie można skopiować całe repozytorium (można nawet tylko wybrane katalogi) do innego z zachowaniem historii. W tym przypadku skopiowalibyśmy je do innego projektu, właśnie do takiego przygotowanego orphan branch. Następnie scalamy ten orphan branch z naszym branchem developerskim. W ten sposób mamy w naszym projekcie nowy kod, ale z zachowaniem jego historii z poprzedniego repozytorium.
Jak zrobić orphan branch?
git checkout --orphan <nazwa_brancha>

Wszystkie pliki z brancha z którego robiliśmy nasz nowy branch zostaną skopiowane i dodane do staging area. Skoro chcemy mieć brancha z całkowicie nową historią i innym kodem, należy te pliki usunąć:
git rm -rf .

Możemy dodać teraz pliki i zrobić pierwszy commit na tym branchu. Dodałem plik README.md i zrobiłem commit. W historii jest tylko jeden wpis.
Po wykonaniu commita widać w konsoli informację, że utworzony commit, to root-commit.

Podsumowanie
W tym wpisie pokazałem jak można zrobić orphan branch. Nie jest to wcale trudne. Taki rodzaj brancha jest bardzo rzadko wykorzystywany, ale czasem może się przydać.
Graf z początku wpisu jest zrobiony w narzędziu Visualize Git.
Źródła:
3 Komentarze
marbel82 · 14 stycznia 2019 o 11 h 39 min
Czy mógłbyś wytłumaczyć co miałeś na myśli pisząc: “Teoretycznie jeden commit może mieć nieskończenie wiele commitów.”?
Tomasz Prasołek · 14 stycznia 2019 o 11 h 57 min
Już poprawione. Miało być “nieskończenie wiele rodziców”. Dzięki za zwrócenie uwagi.
jkwi · 22 lutego 2020 o 18 h 43 min
Orphan branch wydaje się dobrym rozwiązaniem dla projektów embedded (małych), gdzie jeden zespół utrzymuje wiele niepowiązanych ze sobą elementów projektu (albo powiązanych wyłącznie na poziomie koncepcyjnym). Mam tu na myśli projekt, który zawiera (oczywiście) kod źródłowy, a obok niego jeszcze schemat elektryczny urządzenia i projekt PCB, rysunek mechaniczny urządzenia, dokumenty techniczne np. specyfikacja, itd. Każdy z tych dodatkowych elementów może być trackowany na osobnym orphan branchu.