Tworzę skrypt wdrożeniowy dla mojego projektu git i właśnie zacząłem używać tagów. Dodałem nowy tag o nazwie v2.0
:
git tag -a v2.0 -m "Launching version 2.0"
I przekazałem ten tag do zdalnego repozytorium
git push --tags
Kiedy próbuję wykonać skrypt wdrażania i sprawdzić v2.0
tag, otrzymuję następujący komunikat:
Jesteś w stanie „odłączonej głowy”. Możesz się rozglądać, wprowadzać eksperymentalne zmiany i zatwierdzać je, a także odrzucić wszelkie zmiany wprowadzone w tym stanie bez wpływu na gałęzie, wykonując kolejne pobranie. Jeśli chcesz utworzyć nową gałąź, aby zachować utworzone przez siebie zatwierdzenia, możesz to zrobić (teraz lub później), używając ponownie -b z poleceniem checkout. Przykład: git checkout -b nazwa_nowy_branch HEAD jest teraz na
Czy to normalne? Repozytorium jest w zawieszeniu, ponieważ jeśli to zrobię:
git branch
Otrzymuję ten wynik:
* (no branch)
master
Przepraszam, jeśli to oczywiste, ale nie mogłem tego rozgryźć.
źródło
Odpowiedzi:
OK, najpierw kilka terminów nieco uproszczonych.
W
git
, Atag
(podobnie jak wiele innych rzeczy) jest to, co nazywa się treeish . To sposób na nawiązanie do jakiegoś punktu w historii projektu. Drzewo może być znacznikiem, zatwierdzeniem, specyfikatorem daty, specyfikatorem porządkowym lub wieloma innymi rzeczami.Teraz a
branch
jest jak tag, ale jest ruchomy. Kiedy jesteś „na” gałęzi i robisz zatwierdzenie, gałąź jest przenoszona do nowego zatwierdzenia, którego dokonałeś, wskazując jego aktualną pozycję.Twój
HEAD
jest wskaźnikiem do gałęzi, która jest uważana za „bieżącą”. Zwykle, gdy klonujesz repozytorium,HEAD
wskaże,master
które z kolei wskaże zatwierdzenie. Kiedy następnie robisz coś takiegogit checkout experimental
, przełączasz się,HEAD
aby wskazywałexperimental
gałąź, która może wskazywać na inny zatwierdzenie.Teraz wyjaśnienie.
Kiedy robisz a
git checkout v2.0
, przełączasz się na zatwierdzenie, które nie jest wskazane przezbranch
. PlikHEAD
Jest teraz „dom”, a nie wskazując na oddział. Jeśli zdecydujesz się teraz zatwierdzić (tak jak możesz), nie ma wskaźnika gałęzi do aktualizacji, aby śledzić to zatwierdzenie. Przełączenie z powrotem do innego zatwierdzenia spowoduje utratę tego nowego zatwierdzenia, które zrobiłeś. To właśnie mówi wiadomość.Zwykle możesz powiedzieć
git checkout -b v2.0-fixes v2.0
. Spowoduje to utworzenie nowego wskaźnika do gałęzi na zatwierdzeniu wskazywanym przez drzewov2.0
(w tym przypadku znacznik), a następnie przesunieHEAD
go do tego miejsca. Teraz, jeśli dokonasz zatwierdzeń, będzie można je śledzić (za pomocąv2.0-fixes
gałęzi) i możesz pracować tak, jak zwykle. Nie ma nic "złego" w tym, co zrobiłeś, zwłaszcza jeśli chcesz tylko rzucić okiem nav2.0
kod. Jeśli jednak chcesz wprowadzić tam zmiany, które chcesz śledzić, będziesz potrzebować gałęzi.Powinieneś poświęcić trochę czasu na zrozumienie całego modelu gita DAG. Jest to zaskakująco proste i sprawia, że wszystkie polecenia są dość jasne.
źródło
git reflog
, co jest świetnym poleceniem, o którym warto wiedzieć! Dopóki nie doszło do czyszczenia pamięci, pozornie „niemożliwe” jest utrata zatwierdzenia.Tak, to normalne. Dzieje się tak, ponieważ pobierasz pojedynczy zatwierdzenie, które nie ma głowy. Zwłaszcza że (wcześniej czy później) nie jest szefem żadnej gałęzi.
Ale zwykle nie ma problemu z tym stanem. Możesz stworzyć nową gałąź z tagu, jeśli dzięki temu poczujesz się bezpieczniej :)
źródło