Co to jest HEAD w git?


232

Wydaje się, że istnieje różnica między ostatnim zatwierdzeniem, HEAD a stanem pliku, który widzę w moim katalogu.

Co to jest HEAD, co mogę z tym zrobić i jakiego błędu powinienem unikać?



1
Począwszy od Git v1.8.4, wszystkie odpowiedzi poniżej tego zastosowania HEADlub headmogą teraz używać @zamiast HEADzamiast. Zobacz tę odpowiedź (ostatnia sekcja), aby dowiedzieć się, dlaczego możesz to zrobić.

3
Z git-scm : HEAD w Git jest wskaźnikiem do bieżącego odniesienia do gałęzi, który z kolei jest wskaźnikiem do ostatniego zatwierdzenia, które wykonałeś lub ostatniego zatwierdzenia, które zostało wypisane do katalogu roboczego. Oznacza to również, że będzie rodzicem następnego zatwierdzenia. Na ogół najłatwiej jest to sobie wyobrazić, ponieważ HEAD jest migawką twojego ostatniego zatwierdzenia.
Quazi Irfan

3
Możliwe duplikaty Co to jest HEAD w Git?
Buts,

Odpowiedzi:


185

HEAD jest odniesieniem do ostatniego zatwierdzenia w aktualnie wyewidencjonowanym oddziale.


Istnieje mały wyjątek od tego, jakim jest ODŁĄCZONA GŁOWA. Wolnostojący HEAD jest sytuacja skończy się w dowolnym momencie sprawdzić się popełnić (lub tag) zamiast gałęzi. W takim przypadku musisz to sobie wyobrazić jako tymczasową gałąź bez nazwy; więc zamiast referencji oddziału mamy tylko HEAD. Nadal pozwoli ci to na zatwierdzanie (co zaktualizuje HEAD), więc powyższa krótka definicja jest nadal prawdziwa, jeśli myślisz o odłączonej HEAD jako tymczasowej gałęzi bez nazwy.


1
Dlaczego więc możesz mieć dwie głowy?
e-satis

1
@ e-satis: czasami zobaczysz gałęzie zwane głowami - są one przechowywane refs/heads. HEADJednak mała głowa różni się od . Moja odpowiedź nieco to wyjaśnia.
Cascabel

7
@ e-satis: To nie jest wyrażenie regularne. Jest ^to po prostu notacja git dla „zatwierdzenia przed” - to zatwierdzenie przed bieżącym. (Jeśli prąd jest scaleniem, używa pierwszego rodzica.)
Cascabel

1
@ e-satis: Zobacz sekcję specyfikacji wersji strony podręcznika dla git-rev-list, aby uzyskać więcej informacji na temat wszystkich sposobów określania zatwierdzeń - to tylko jeden mały kawałek. kernel.org/pub/software/scm/git/docs/…
Cascabel

1
Nie, kiedy rev i HEAD wskazują na to samo zatwierdzenie, nie ma różnicy. I możesz nawet zapisać identyfikator zatwierdzenia (wartość SHA-1) zamiast rev lub HEAD. I nie martw się, nie nękasz nas pytaniami :) (przynajmniej ja: P)
poke

87

HEAD jest odwołaniem (odniesieniem) do aktualnie sprawdzonego zatwierdzenia.

W normalnych stanach jest to właściwie symboliczne odniesienie do gałęzi, którą sprawdziłeś - jeśli spojrzysz na zawartość .git / HEAD zobaczysz coś w rodzaju „ref: refs / heads / master”. Sama gałąź jest odniesieniem do zatwierdzenia na końcu gałęzi. Dlatego w stanie normalnym HEADefektywnie odnosi się do zatwierdzenia na końcu bieżącej gałęzi.

Możliwe jest również posiadanie „odłączonej HEAD”. Dzieje się tak, gdy wypisujesz coś poza gałęzią (lokalną), taką jak gałąź zdalna, określone zatwierdzenie lub tag. Najczęstszym miejscem, w którym można to zobaczyć, jest interaktywna baza danych, kiedy wybierasz edycję zatwierdzenia. W stanie odłączonym HEAD HEAD jest bezpośrednim odniesieniem do zatwierdzenia - zawartość .git / HEAD będzie skrótem SHA1.

Ogólnie rzecz biorąc, HEAD to po prostu wygodna nazwa oznaczająca „to, co sprawdziłeś” i naprawdę nie musisz się o to martwić. Po prostu pamiętaj o tym, co sprawdziłeś i pamiętaj, że prawdopodobnie nie chcesz zatwierdzać, jeśli nie jesteś na gałęzi (odłączony stan HEAD), chyba że wiesz, co robisz (np. Jesteś w interaktywnej bazie) .


6
To jest coś, czego nie rozumiem. Jeśli kasujesz zdalną gałąź, dlaczego skończysz z „odłączoną HEAD”. Dlaczego nie wskoczysz automatycznie do oddziału w lokalnym repozytorium, który odpowiada Twojemu pilotowi?
e-satis

3
@ e-satis: Jeśli chcesz oddział lokalny, sprawdź oddział lokalny. Pamiętaj, że te dwa niekoniecznie są takie same - musisz powiedzieć lokalnemu, aby scalił zdalny (lub pociągnął). Śledzenie jest po to, aby wiedzieć, który z nich automatycznie pobierać, gdy o to poprosisz. Przyczyną odłączenia jest to, że gałąź zdalna ma być wskaźnikiem do ostatnio widzianej lokalizacji gałęzi w zdalnym repozytorium. Jeśli spróbujesz się do niego zaangażować, zdalne repozytorium nie zmieni się, więc zdalna gałąź też nie powinna.
Cascabel

1
OK, tego nie dostałem: posiadanie lokalnego oddziału o takiej nazwie nie oznacza, że ​​jest taki sam jak odległy. Naprawdę trudno się na początku dostać, bo pochodzę z SVN :-) Dzięki, stary. BTW, jak przenieść HEAD bezgłowy do lokalnego oddziału, aby go tutaj zatwierdzić?
e-satis

3
@ e-satis: Ogólna odpowiedź brzmi git rebase <branch> HEAD. W ten sposób znajdzie się ostatni wspólny przodek <branch>i HEAD, a następnie weźmie wszystkie stamtąd stamtąd HEADi zastosuje je (dokona ich podstaw) <branch>. Zasadniczo robi to poprzez zastosowanie ich jako łatek, więc jeśli dwie gałęzie są naprawdę różne, mogą wystąpić konflikty. Ale jeśli <branch>jest przodkiem HEAD(tj. Byłeś we właściwym miejscu, po prostu zapomniałeś, że się oderwałeś HEAD), podstawa jest po prostu szybkim połączeniem.
Cascabel

3
Jest to jeden z najbardziej przejrzystych i dokładnych opisów git HEAD, jakie widziałem, po pewnym czasie.
LarsH

21

Zawsze myślałem, że HEAD~5oznacza GO do 5 zmian wcześniej. Ale nie zawiera części GO polecenia. Niesie tylko część polecenia / „gdzie” .

Mówiąc najprościej, odpowiada na pytanie: GDZIE powinienem iść? Do którego zobowiązania?

  • HEAD oznacza (odniesienie do) bieżącego zatwierdzenia
  • HEAD~1 oznacza (odniesienie do) 1 zatwierdzenie wcześniej
  • HEAD~ TAKŻE oznacza (odniesienie do) 1 zatwierdzenie wcześniej
  • HEAD~87 oznacza (odniesienie do) 87 wcześniej

Stosowanie:

  • git checkout HEAD~1 faktycznie GO / checkout do 1 zatwierdzenia / referencji wcześniej
  • git reset HEAD~3 odrzuci twoje ostatnie 3 zatwierdzenia - bez usuwania zmian, tzn. możesz zobaczyć wszystkie zmiany dokonane w ostatnich 3 zatwierdzeniach razem, usunąć wszystko, co ci się nie podoba lub dodać do niego, a następnie zatwierdzić je wszystkie ponownie.
  • git reset --hard HEAD~3odrzuci twoje ostatnie zatwierdzenie i usunie ich zmiany . Całkowicie usunie te zmiany. Więcej informacji tutaj .
  • git diff HEAD~3 do sprawdzania zmian w ostatnich 3 zatwierdzeniach

3
wracając do własnej odpowiedzi :)
Honey

15

Wskaźnik HEAD w Git

Git utrzymuje zmienną referencyjną o nazwie HEAD. I nazywamy tę zmienną wskaźnikiem, ponieważ jej celem jest odwołanie się lub wskazanie konkretnego zatwierdzenia w repozytorium. Gdy wprowadzamy nowe zatwierdzenia, wskaźnik zmieni się lub przejdzie do wskazania nowego zatwierdzenia. HEAD zawsze wskazuje na wierzchołek bieżącej gałęzi w naszym repozytorium. Ma to związek z naszym repozytorium, a nie z indeksem pomostowym lub katalogiem roboczym.

Innym sposobem myślenia o tym jest ostatni stan naszego repozytorium lub to, co zostało ostatnio wyewidencjonowane, a ponieważ jest to miejsce, w którym repozytorium zostało przerwane lub ostatni stan, można również powiedzieć, że HEAD wskazuje na rodzica następnego zatwierdzenia lub jego gdzie będzie miało miejsce zapisywanie zmian.

Myślę, że dobrą metaforą do przemyślenia tego jest odtwarzanie i nagrywanie na magnetofonie kasetowym. Gdy zaczynamy nagrywać dźwięk, taśma przesuwa się obok głowy i nagrywa na nią. po naciśnięciu przycisku Zatrzymaj miejsce, w którym zatrzymana jest głowica zapisująca, to miejsce, w którym zacznie ponownie nagrywać po ponownym naciśnięciu przycisku Nagrywaj. Teraz możemy się poruszać, możemy przesunąć głowicę w różne miejsca, ale gdziekolwiek jest ona umieszczona kiedy ponownie uderzymy w Record, zacznie się nagrywanie.

Wskaźnik HEAD w Git jest bardzo podobny, wskazuje miejsce, w którym rozpoczniemy nagrywanie w następnej kolejności. To miejsce, w którym przerwaliśmy w naszym repozytorium rzeczy, które popełniliśmy.


0

Mówiąc najprościej, HEAD jest odniesieniem do ostatniego zatwierdzenia w gałęzi aktualnie wyewidencjonowanej.

Pomyśl o HEAD jako o „bieżącej gałęzi”. Po zmianie gałęzi za pomocą git checkout wersja HEAD zmienia się tak, aby wskazywała końcówkę nowej gałęzi.

Możesz zobaczyć, na co wskazuje HEAD, wykonując:

cat .git/HEAD

HEAD może odwoływać się do konkretnej wersji, która nie jest powiązana z nazwą oddziału. Ta sytuacja nazywa się odłączoną HEAD.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.