To zależy od tego, co chcesz zrobić, kiedy sprawdzasz to zatwierdzenie. Jeśli wszystko, co robisz, to sprawdzanie go, aby móc zbudować lub przetestować tę wersję, to nie ma nic złego w pracy z odłączoną głową. Pamiętaj tylko, aby sprawdzić aktualną gałąź przed wykonaniem jakichkolwiek zatwierdzeń ( git checkout master
na przykład), aby nie tworzyć zatwierdzeń, które nie są zawarte w żadnej gałęzi.
Jeśli jednak chcesz zrobić więcej zatwierdzeń od tego momentu, powinieneś utworzyć gałąź. Jeśli zrobisz zatwierdzenia, do których gałąź nie odwołuje się, mogą łatwo się zgubić i ostatecznie zostaną wyczyszczone przez garbage collector git, ponieważ nic się do nich nie odnosi. Możesz utworzyć nową gałąź, uruchamiając:
git checkout -b newbranch ea3d5ed
Aby pomóc w wizualizacji, oto kilka diagramów pokazujących, jak praca z odłączoną głową różni się od pracy na gałęzi.
Zacznijmy od 3 zatwierdzeń master
, A, B i C. master
to bieżąca gałąź, więc HEAD
wskazuje master
, która wskazuje na zatwierdzenie C.
ABC
* - * - * <- master <- HEAD
Teraz, jeśli zatwierdzimy, git utworzy zatwierdzenie, które ma C jako rodzica (ponieważ jest to bieżące zatwierdzenie, wskazywane przez HEAD
via master
) i zaktualizuje się, master
aby wskazywało na to nowe zatwierdzenie. Wszystkie nasze zatwierdzenia są teraz dostępne master
i HEAD
wskazują na nowe zatwierdzenie master
.
ABCD
* - * - * - * <- master <- HEAD
Teraz sprawdźmy B, dając nam oderwany HEAD
.
ABCD
* - * - * - * <- master
^
\-- GŁOWA
Tutaj wszystko działa dobrze; możemy przeglądać wszystkie pliki, budować nasz program, testować go, itp. Możemy nawet tworzyć nowe zatwierdzenia; ale jeśli to zrobimy, nie ma gałęzi, na której jesteśmy, więc nie możemy wskazać żadnej gałęzi na to nowe zatwierdzenie. Jedyne, co na to wskazuje, to HEAD
:
ABCD
* - * - * - * <- master
\
* <- HEAD
mi
Jeśli później zdecydujemy się sprawdzić master
ponownie, nie będzie nic odnoszącego się do E.
ABCD
* - * - * - * <- master <- HEAD
\
*
mi
Ponieważ nic do tego nie odnosi się, może to być trudne do znalezienia, a git rozważa zmiany bez odniesień do porzucenia (zdarzają się one dość często, jeśli dokonujesz rebase'u, wprowadzasz łatki do squasha lub wykonujesz inne zabawne manipulacje historią; zwykle reprezentują one na którym już Ci nie zależy). Po pewnym czasie git uzna to za śmieci do odrzucenia przy następnym uruchomieniu czyszczenia pamięci.
Tak więc, zamiast sprawdzać gołą wersję i uzyskiwać odłączoną głowę, jeśli czujesz, że zamierzasz wykonać więcej zatwierdzeń, powinieneś użyć git checkout -b branch B
do stworzenia gałęzi i sprawdzenia. Teraz twoje zatwierdzenia nie zostaną utracone, ponieważ zostaną uwzględnione w gałęzi, do której możesz łatwo się odwołać i połączyć później.
ABCD
* - * - * - * <- master
^
\ - gałąź <- HEAD
Jeśli zapomnisz o tym zrobić i utworzysz zatwierdzenia z gałęzi, nie musisz się martwić. Możesz utworzyć gałąź odwołującą się do wersji głowy za pomocą git checkout -b branch
. Jeśli już przełączyłeś się z powrotem do master
gałęzi i zdałeś sobie sprawę, że zapomniałeś zbłąkanego zatwierdzenia, możesz go znaleźć, używając git reflog
, które pokaże historię tego, na HEAD
co wskazywały zmiany w ciągu ostatnich kilku dni. Wszystko, co nadal znajduje się w reflogu, nie będzie zbierane jako śmieci i generalnie odwołania są przechowywane w reflogu przez co najmniej 30 dni.