Orphan branch – komu to potrzebne? A dlaczego?

Opublikowane przez Tomasz Prasołek w dniu

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.

Ostatni commit na 2 rodziców. Wszystkie poprzednie jednego. Pierwszy commit ich nie posiada.

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:

  1. 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.
  2. 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>
Create orphan branch

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 .
Remove all files from repository

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:


4 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.

Viki · 20 kwietnia 2024 o 17 h 09 min

Dziękuję za opisanie tej opcji. Rzadko można trafić na jej opis, zwłaszcza po polsku.

Wypróbowałem tą opcję i jestem zaskoczony zachowaniem gita. Już tłumaczę. Mam dwie gałęzie: ‘master’ i osieroconą ‘orph_br’.
1) Zachowuję wszystko, czyli nie wykonuję “git rm -rf .”
2) Dodaję katalog z podkatalogami i plikami do gałęzi ‘orph_br’. Żeby przyspieszyć ten test, po prostu skopiowałem z jakiejś aplikacji taki katalog.
3) Zatwierdzam zamiany: “git commit -m ‘Nowy katalog z plikami’ ”
4) Przełączam się do gałęzi ‘master’.

Sprawdzam katalogi i pliki, i co? Okazuje się, że w ‘masterze’ pojawił się ten katalog z podkatalogami i z niektórymi plikami, to znaczy z tymi, które, jak zauważyłem, są uwzględnione w .gitignore za pomocą wpisu ‘pycache/’.
Spodziewałem się, że osierocona gałąź jest zupełnie samodzielnym bytem.

Czy możesz wytłumaczyć to zachowanie gita?
Z góry dzięki.

P.S. Także za artykuł – dzięki.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *