OK, najpierw kilka terminów nieco uproszczonych.
W git
, A tag
(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ś takiego git 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 przez branch
. 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 drzewo v2.0
(w tym przypadku znacznik), a następnie przesunie HEAD
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 na v2.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.