Co to jest HEAD w Git?

Odpowiedzi:

774

Możesz myśleć o HEAD jako o „bieżącej gałęzi”. Po zmianie gałęzi za git checkoutpomocą zmiany HEAD zmienia się tak, aby wskazywała wierzchołek nowej gałęzi.

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

cat .git/HEAD

W moim przypadku wynikiem jest:

$ cat .git/HEAD
ref: refs/heads/master

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 .

Greg Hewgill
źródło
52
Więc git HEAD jest zależny od kontekstu, na którym ODDZIAŁU jesteś, prawda? Jeszcze dalej, ty jako programista? Myślę, że pytam, czy Git HEAD będzie globalną rzeczą dla całego repozytorium, czy indywidualną dla każdego dewelopera?
bobobobo
90
@bobobobo: Zgadza się, HEAD jest jak wskaźnik wskazujący bieżącą gałąź. Gdy kasujesz inną gałąź, HEAD zmienia się, wskazując na nową. Obecny HEAD jest lokalny dla każdego repozytorium, a zatem jest indywidualny dla każdego programisty.
Greg Hewgill,
16
@Meng Ten pomógł mi, mam nadzieję, że to pomoże: marklodato.github.com/visual-git-guide/index-en.html
raphael
53
@ 動靜 能量: HEAD może wskazywać na każde zatwierdzenie, nie musi być ostatnim zatwierdzeniem w żadnej gałęzi. (Gdy HEAD wskazuje na zatwierdzenie, które nie jest ostatnim zatwierdzeniem w gałęzi, jest to „odłączony HEAD”).
Greg Hewgill
126
HEAD nie jest „bieżącą gałęzią”. Jest to nazwa nadana zatwierdzeniu, z którego został zainicjowany bieżący stan drzewa roboczego. Z praktycznego punktu widzenia można to traktować jako symboliczne odniesienie do zatwierdzonego pobrania.
Ben Collins,
184

Aby zacytować inne osoby :

Głowa jest po prostu odniesieniem do obiektu zatwierdzenia. Każda głowa ma nazwę (nazwa oddziału lub nazwa znacznika itp.). Domyślnie w każdym repozytorium znajduje się nagłówek o nazwie master. Repozytorium może zawierać dowolną liczbę głów. W danym momencie jedna głowa jest wybierana jako „aktualna głowa”. Ta głowa jest pseudonimem HEAD, zawsze wielkimi literami ”.

Zwróć uwagę na tę różnicę: „głowa” (małe litery) oznacza dowolną z nazwanych głów w repozytorium; „HEAD” (wielkie litery) odnosi się wyłącznie do aktualnie aktywnej głowy. To rozróżnienie jest często używane w dokumentacji Git.

Kolejne dobre źródło, które szybko omawia wewnętrzne działanie git (i dla lepszego zrozumienia head / HEAD) można znaleźć tutaj . Referencje (ref :) lub głowy lub gałęzie można traktować jak notatki post-it naklejone na zatwierdzenia w historii zmian. Zazwyczaj wskazują na końcówkę serii zatwierdzeń, ale można je przenosić za pomocą git checkoutlub git resetitp.

Silfheed
źródło
Z tego: „Każda głowa ma imię”. I „jedna głowa jest wybrana jako„ bieżąca głowa ”. Ta głowa jest aliasowana do HEAD ”. Wnioskuję z tego, że „HEAD” nie odnosi się do sytuacji „odłączonej HEAD”.
gxyd
1
@gxyd, jeśli HEAD nie wskazuje na „głowę”, to HEAD jest odłączony. Wskazuje identyfikator zatwierdzenia, który podałeś (na przykład, git checkout HEAD~2), który nie jest identyfikatorem zatwierdzenia znanej głowy. Bardziej szczegółowe wyjaśnienia znajdują się w artykule na eagain.net/articles/git-for-computer-scientists .
Silfheed
1
@Silfheed: Generalnie myślę, że ta odpowiedź jest koncepcyjnie bardziej dźwięczna niż zaakceptowana (chociaż użycie małej litery „head” w odniesieniu do gałęzi dezorientuje wielu ludzi). Nie git revertjest to jednak dobry przykład przesunięcia gałęzi, aby nie znajdowała się na końcu, ponieważ git revertpo prostu tworzy nowe zatwierdzenia i wciąż pozostawia bieżącą gałąź na (nowej) końcówce.
LarsH
1
„który nie jest identyfikatorem zatwierdzenia znanej głowy” - w rzeczywistości odłączony HEAD może wskazywać na identyfikator zatwierdzenia, który jest również identyfikatorem zatwierdzenia znanej głowy (lub kilku głów). Odłączenie polega na tym, że HEAD wskazuje bezpośrednio na identyfikator zatwierdzenia, a nie na głowę. commitreset
Wpłynie
1
@LarsH: Dobra uwaga na odłączonym HEAD wskazującym na identyfikator zatwierdzenia zamiast odwołania. Możesz to zweryfikować, patrząc na .git / HEAD. Jeśli zostanie odłączony, będzie zawierał skrót zmiany, nawet jeśli jest to ta sama zmiana, co znana głowa. Jeśli jest dołączony, będzie zawierać ścieżkę do głowy (tzn. „Ref: refs / heads / bob”). Jeśli chodzi o polecenie powrotu, po 8 latach nigdy nie złapałem tej literówki. Reset Git jest tym, co pozwala dostosować konkretną głowicę, aby wskazywała na konkretny zatwierdzenie.
Silfheed
62

Polecam tę definicję twórcy github Scottowi Chaconowi [ referencje wideo ]:

Głowa jest twoją obecną gałęzią. Jest to symboliczne odniesienie. Jest to odniesienie do oddziału. Zawsze masz HEAD, ale HEAD będzie wskazywał na jeden z tych innych wskaźników, na jedną z gałęzi, na której jesteś. Jest rodzicem twojego następnego zatwierdzenia. To powinno być to, co było ostatnio wyewidencjonowane w twoim katalogu roboczym ... To jest ostatni znany stan twojego katalogu roboczego.

Cały film będzie uczciwym wprowadzeniem do całego systemu git, więc polecam również obejrzenie go, jeśli masz na to czas.

jasoares
źródło
34
Tak więc prawdziwą def jest „rodzic twojego następnego zatwierdzenia”
nicolas
1
a także „rzecz wskazująca na następną gałąź, która się poruszy”
Nicolas
@nicolas - nie sądzę, że to prawda. HEAD może wskazywać na każde zatwierdzenie, niekoniecznie musi wskazywać na gałąź - jeśli nie, jesteś w trybie „odłączonej HEAD”.
scubbo
23
Film jest świetny, ale niestety stanowi nieodpowiednią odpowiedź na przepełnienie stosu. Co się stanie, jeśli film zostanie kiedyś zdjęty? Wtedy twój link nie będzie wskazywał na nic. Lepszą odpowiedzią byłby zapis tego, co Scott mówi w filmie.
2
Scott mówi, że HEAD jest wskaźnikiem do gałęzi. Ale HEAD może również wskazywać na stare zmiany. To bardzo mylące.
Fixee
60

HEAD to tylko specjalny wskaźnik, który wskazuje lokalny oddział, w którym aktualnie się znajdujesz.

Z książki Pro Git , rozdział 3.1 Git Rozgałęzienie - Oddziały w pigułce , w sekcji Tworzenie nowego oddziału :

Co się stanie, jeśli utworzysz nowy oddział? Cóż, zrobienie tego tworzy nowy wskaźnik do poruszania się. Załóżmy, że tworzysz nowy oddział o nazwie testowanie. Robisz to za pomocą polecenia git branch:

$ git branch testing 

Spowoduje to utworzenie nowego wskaźnika przy tym samym zatwierdzeniu, w którym aktualnie jesteś

wprowadź opis zdjęcia tutaj

Skąd Git wie, w której branży aktualnie jesteś? Zachowuje specjalny wskaźnik o nazwie HEAD. Zauważ, że jest to coś zupełnie innego niż koncepcja HEAD w innych VCS, do których możesz być przyzwyczajony, takich jak Subversion lub CVS. W Git jest to wskaźnik do lokalnego oddziału, w którym aktualnie się znajdujesz. W tym przypadku nadal jesteś mistrzem. Polecenie git branch utworzyło tylko nową gałąź - nie przełączyło się na tę gałąź.

wprowadź opis zdjęcia tutaj

Alexandr
źródło
4
Fajnie, przydałoby się jednak zdjęcie przedstawiające odłączoną skrzynkę HEAD
Don Hatch,
@DonHatch, Dobre wyjaśnienie odłączonego HEAD stackoverflow.com/a/35301963/1074179
Alexandr
3
Niezła odpowiedź. Gałęzie są niczym innym jak zatwierdzonymi etykietami, kiedy dokonujesz nowych zatwierdzeń, ta etykieta jest przenoszona do nowego nowego zatwierdzenia. Kiedy kasujesz zatwierdzenie, które nie ma etykiety, jest w stanie odłączonym HEAD. Oznacza to, że HEAD wskazuje na zatwierdzenie, które nie ma etykiety gałęzi. Jeśli wykonasz transakcję 34ac2w powyższym przykładzie, teraz HEAD wskazywałby na to zatwierdzenie i nazywa się HEAD odłączonym. W tym stanie możesz także wprowadzać zmiany, eksperymentować i zatwierdzać zmiany, ale po przejściu do innej gałęzi stracisz wszystkie zmiany, chyba że oczywiście utworzysz nową gałąź.
sleepwalkerfx
1
@sleepwalkerfx, ale możesz sprawdzić zatwierdzenie, które ma etykietę gałęzi i nadal jest w stanie odłączonej głowy, ponieważ HEAD nie wskazuje już etykiety gałęzi, ale identyfikator zatwierdzenia gałęzi
Marc
1
@sleepwalkerfx Myślę, że w tym momencie mówimy o semantyce. Masz rację, etykieta gałęzi jest tekstowym odwołaniem do konkretnego zatwierdzenia. Nie jest to jednak zatwierdzenie. Więc jeśli zrobiłeś a git logi dostałeś coś takiego commit ad0265... HEAD -> foo ..., oznaczałoby to, że foogałąź jest referencją do zatwierdzenia id ad0265. Wykonanie kasy odwołania do tekstu foonie jest odłączoną głową. Wykonanie kasy identyfikatora zatwierdzenia ad0265spowoduje odłączenie głowy. Być może brakuje mi subtelności tego, co komunikujesz. Mam nadzieję, że ta ściana tekstu pomoże odkryć, gdzie się zgubiłem.
Marc
40

Zakładając, że nie jest to szczególny przypadek zwany „odłączoną GŁOWĄ”, to, jak stwierdzono w książce O'Reilly Git, 2. wydanie, str. 69, HEADoznacza:

HEADzawsze odnosi się do ostatniego zatwierdzenia w bieżącym oddziale. Po zmianie oddziałów HEADjest aktualizowany w celu odniesienia do ostatniego zatwierdzenia nowego oddziału.

więc

HEADjest „wskazówką” bieżącej gałęzi .

Zauważ, że możemy użyć, HEADaby odwoływać się do ostatniego zatwierdzenia, i użyć HEAD~jako zatwierdzenie przed wskazówką, HEAD~~lub HEAD~2jako zatwierdzenie nawet wcześniej, i tak dalej.

niepolarność
źródło
26

Istnieje pewna subtelna, ale ważna nieporozumienie w szeregu tych odpowiedzi. Myślałem, że dodam swoją odpowiedź, aby to wyjaśnić.

Co to jest HEAD?

GŁOWA TO TY

HEADjest symbolicznym odniesieniem wskazującym, gdziekolwiek jesteś w swojej historii zatwierdzeń. Podąża za tobą, gdziekolwiek jesteś, cokolwiek robisz, jak cień. Jeśli dokonasz zatwierdzenia, HEADprzeniesie się. Jeśli coś kasy, HEADprzeniesie się. Cokolwiek zrobisz, jeśli przeprowadziłeś się gdzieś nowy w swojej historii zatwierdzeń, HEADposzedłeś razem z tobą. Aby rozwiązać jeden powszechny nieporozumienie: nie możesz się oderwać HEAD. Nie taki jest stan odłączonej HEAD. Jeśli kiedykolwiek pomyślisz: „och nie, jestem w stanie HEAD odłączonym! Zgubiłem HEAD!” Pamiętaj, to twoja GŁOWA. GŁOWA to ty. Nie odłączyłeś się od HEAD, ty i HEAD odłączyliście się od czegoś innego.

Do czego może dołączyć HEAD?

HEADmoże wskazywać na zatwierdzenie, tak, ale zazwyczaj nie. Pozwól mi to powtórzyć. Zazwyczaj HEADnie wskazuje na zatwierdzenie. Wskazuje odwołanie do gałęzi. Jest dołączony do tej gałęzi, a kiedy robisz pewne rzeczy (np. commitLub reset), dołączona gałąź będzie się poruszać wraz z HEAD. Możesz zobaczyć, na co to wskazuje, patrząc pod maską.

cat .git/HEAD

Zwykle otrzymasz coś takiego:

ref: refs/heads/master

Czasami otrzymasz coś takiego:

a3c485d9688e3c6bc14b06ca1529f0e78edd3f86

Tak się dzieje, gdy HEADwskazuje bezpośrednio na zatwierdzenie. Nazywa się to odłączoną HEAD, ponieważ HEADwskazuje na coś innego niż odwołanie do gałęzi. Jeśli dokonasz zatwierdzenia w tym stanie, masternie będąc już przywiązanym HEAD, nie będzie się z tobą poruszał. Nie ma znaczenia, gdzie jest to zatwierdzenie. Możesz być na tym samym zatwierdzeniu co gałąź master, ale jeśli HEADwskazuje on na zatwierdzenie, a nie na gałąź, zostanie on odłączony i nowe zatwierdzenie nie zostanie powiązane z odniesieniem do gałęzi.

Możesz spojrzeć na to graficznie, jeśli spróbujesz wykonać następujące ćwiczenie. Uruchom z repozytorium git. Dostaniesz coś nieco innego, ale będą tam bity klucza. Kiedy nadszedł czas, aby bezpośrednio sprawdzić zatwierdzenie, po prostu użyj skróconego skrótu, który otrzymujesz z pierwszego wyjścia (tutaj a3c485d).

git checkout master
git log --pretty=format:"%h:  %d" -1
# a3c485d:   (HEAD -> master)

git checkout a3c485d -q # (-q is for dramatic effect)
git log --pretty=format:"%h:  %d" -1   
# a3c485d:   (HEAD, master)

OK, więc tutaj jest niewielka różnica w wydajności. Bezpośrednie sprawdzenie zatwierdzenia (zamiast gałęzi) daje nam przecinek zamiast strzałki. Jak myślisz, czy jesteśmy w stanie HEAD? HEAD wciąż odnosi się do konkretnej wersji związanej z nazwą oddziału. Nadal jesteśmy w gałęzi master, prawda?

Spróbuj teraz:

git status
# HEAD detached at a3c485d

Nie. Jesteśmy w stanie „odłączonej HEAD”.

Można zobaczyć tę samą reprezentację (HEAD -> branch)vs. (HEAD, branch)z git log -1.

Podsumowując

HEADto ty. Wskazuje na wszystko, co sprawdziłeś, gdziekolwiek jesteś. Zazwyczaj nie jest to zatwierdzenie, to gałąź. Jeśli HEAD robi wskaż polecenie commit (lub tag), nawet jeśli jest to ten sam popełnić (lub tag), że oddział wskazuje również, pan (i HEAD) zostały oderwane od tego oddziału. Ponieważ nie masz dołączonej gałęzi, gałąź nie podąży za tobą, gdy będziesz dokonywać nowych zatwierdzeń. HEADjednak będzie.

De Novo
źródło
1
Podoba mi się ta odpowiedź, ponieważ chociaż dokumentacja opisuje prawdę, oprogramowanie definiuje prawdę. .git/HEADto, co oprogramowanie uważa za HEAD.
Don Branson,
2
Dla samej definicji koncepcyjnej powinna to być zaakceptowana odpowiedź.
ata
22

HEADodnosi się do bieżącego zatwierdzenia wskazywanego przez twoją kopię roboczą, tj. zatwierdzenia, które aktualnie wypisałeś. Z oficjalnej dokumentacji jądra Linux na temat określania wersji Git :

HEAD nazywa zatwierdzenie, na podstawie którego dokonano zmian w działającym drzewie.

Należy jednak pamiętać, że w nadchodzącej wersji 1.8.4 Git @może być również używany jako skrót dla HEAD, jak zauważył współtwórca Git Junio ​​C Hamano na swoim blogu Git Blame :

Zamiast wpisywać „HEAD”, możesz zamiast tego powiedzieć „@”, np. „Git log @”.

Użytkownik przepełnienia stosu VonC również znalazł kilka interesujących informacji o tym, dlaczego @został wybrany jako skrót w swojej odpowiedzi na inne pytanie .

Interesujące jest również to, że w niektórych środowiskach nie ma potrzeby HEADużywania wielkich liter, szczególnie w systemach operacyjnych wykorzystujących systemy plików bez rozróżniania wielkości liter, w szczególności Windows i OS X.

Społeczność
źródło
17

Spójrz na Tworzenie i zabawy z gałęziami

HEAD jest tak naprawdę plikiem, którego zawartość określa miejsce, do którego odnosi się zmienna HEAD:

$ cat .git/HEAD
ref: refs/heads/master
$ cat .git/refs/heads/master
35ede5c916f88d8ba5a9dd6afd69fcaf773f70ed

W tym repozytorium zawartość pliku HEAD odnosi się do drugiego pliku o nazwie refs / heads / master . Plik refs / heads / master zawiera skrót najnowszego zatwierdzenia w gałęzi master.

Wynikiem są punkty HEAD do zatwierdzenia gałęzi master z pliku .git / refs / heads / master .

wprowadź opis zdjęcia tutaj

onmyway133
źródło
1
Ostrożnie: link gitguys.com wydaje się wskazywać na zaparkowaną domenę.
MKesper,
14

Chciałbym opisać kilka rzeczy w zaakceptowanej odpowiedzi Grega Hewgila. Według Git Pocket Guide

Oddział:

sama gałąź jest zdefiniowana jako wszystkie punkty osiągalne na wykresie zatwierdzeń z nazwanego zatwierdzenia („końcówka” gałęzi).

GŁOWA: Specjalny rodzaj ref

Specjalny numer referencyjny HEAD określa gałąź, na której jesteś ...

Refs

Git definiuje dwa rodzaje odniesień lub nazwane wskaźniki, które nazywa „refs”:

  • Prosty odnośnik, który wskazuje bezpośrednio na identyfikator obiektu (zwykle zatwierdzenie lub znacznik)
  • Symboliczny symbol referencyjny (lub symref), który wskazuje na inny symbol referencyjny (prosty lub symboliczny)

Jak wspomniał Greg, HEAD może znajdować się w „odłączonym stanie”. HEAD może być więc zwykłym ref (dla odłączonej HEAD) lub symref.

jeśli HEAD jest symbolicznym oznaczeniem dla istniejącej gałęzi, oznacza to, że „włączasz” tę gałąź. Jeśli z drugiej strony HEAD jest prostym oznaczeniem bezpośrednio nadającym zatwierdzenie jego identyfikatorem SHA-1, oznacza to, że nie jesteś „włączony” w żadnej gałęzi, ale raczej w trybie „odłączonej HEAD”, co dzieje się, gdy przejrzysz niektóre wcześniej zobowiązać się do zbadania.

mikrofon
źródło
Dziękuję, @mike! To jest pierwsza odpowiedź, która wyjaśnia, co dzieje się, gdy sprawdzasz wcześniejsze zatwierdzenie. Patrząc na książkę na stronie git, odniosłem wrażenie, że „odłączona GŁOWA” była stanem patologicznym, w który wpadłeś tylko wtedy, gdy zrobiłeś coś dziwnego, opartego na odwróceniu. Ale sprawdzenie wcześniejszego zatwierdzenia nie jest dziwną rzeczą, a kiedy to zrobisz, HEAD nie jest „wierzchołkiem bieżącej gałęzi”. To pierwszy raz, kiedy naprawdę rozumiem.
Nat Kuhn
7

Wydaje mi się, że „HEAD” to aktualny zatwierdzenie transakcji. Innymi słowy, „HEAD” wskazuje aktualnie zatwierdzone zatwierdzenie.

Jeśli właśnie sklonowałeś i nie wyewidencjonowałeś, nie wiem, na co to wskazuje, prawdopodobnie jest to nieprawidłowa lokalizacja.

Nataraj
źródło
Tak, szczególnym odniesieniem HEADjest to, co aktualnie zatwierdziłeś. Szczegółowe informacje można znaleźć w instrukcji (odpowiedni akapit bezpośrednio po rys. 3.4).
Calrion
1
Jeśli sklonujesz repozytorium, git domyślnie sprawdzi mastergałąź - więc HEAD wskaże na master.
śleske,
1
@sleske, jeśli sklonujesz repozytorium bez specjalnych opcji, git sprawdzi zdalną głowę. zwykle jest master, ale nie zawsze. Zobaczremote set-head
De Novo
Mój poprzedni komentarz był poprawny, z wyjątkiem odniesienia do remote set-head, które wpływa tylko na lokalny domyślny oddział i nie zmieni domyślnego na serwerze.
De Novo
5

Kieruj się w stronę wierzchołka aktualnie sprawdzanego oddziału.

wprowadź opis zdjęcia tutaj

W twoim repozytorium znajduje się folder .git. Otwórz plik w tej lokalizacji: .git \ refs \ heads. Kod (hasa sha-1) w tym pliku (w większości przypadków master) będzie ostatnim zatwierdzeniem, tzn. Tym, który widnieje na wyjściu polecenia git log. Więcej informacji na temat folderu .git: http://gitready.com/advanced/2009/03/23/whats-inside-your-git-directory.html

stos1
źródło
1
Często nieporozumieniem jest to, że wierzchołek bieżącej gałęzi wskazuje na ostatnie zatwierdzenie. Zazwyczaj jest to prawda, ale nie jest to również rzadkością git reset HEAD^, a następnie koniec gałęzi nie wskazuje już ostatniego zatwierdzenia (poprzednia wskazówka).
LarsH
4

Świetnym sposobem na dojechanie do domu, punkt podany w poprawnych odpowiedziach jest bieganie git reflog HEAD, masz historię wszystkich miejsc wskazanych przez HEAD.

tjb
źródło
4

Po przeczytaniu wszystkich poprzednich odpowiedzi nadal chciałem uzyskać większą jasność. Ten blog na oficjalnej stronie git http://git-scm.com/blog dał mi to, czego szukałem:

HEAD: Wskaźnik do ostatniej migawki zatwierdzenia, następny rodzic

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. Generalnie najłatwiej jest to sobie wyobrazić, ponieważ HEAD jest migawką twojego ostatniego zatwierdzenia.

użytkownik3751385
źródło
1
HEAD: migawka ostatniego zatwierdzenia, następny rodzic nie jest dokładny. HEADnie jest zatwierdzeniem; to wskazuje na jeden.
jub0bs
Nie ma potrzeby sarkazmu; przed edycją, mimo że cytat był dokładny, duże pogrubione litery były uproszczeniem i nieco mylące. Teraz jest lepiej.
jub0bs
1
JEŻELI czytasz następny wiersz: HEAD w Git jest wskaźnikiem do bieżącego odwołania 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. - Zwróć uwagę na użycie tam słowa „wskaźnik”.
user3751385,
Chociaż opis „migawki z ostatniego zatwierdzenia” daje koncepcyjne wyobrażenie o tym, jak zwykle należy używać HEAD, to jednak nie jest on dokładny. Jeśli dokonam zatwierdzenia, a następnie przełączę się na inną gałąź, HEAD nie wskazuje już ostatniej migawki zatwierdzenia. Wskazuje na ostatnią migawkę zatwierdzenia w gałęzi, do której właśnie się przełączyłem. Jeśli ja checkout HEAD^, teraz HEAD nie wskazuje nawet ostatniej migawki zatwierdzenia w żadnej gałęzi.
LarsH
„Element nadrzędny twojego następnego zatwierdzenia (gdybyś miał teraz zatwierdzić)” jest dokładniejszy, ale w git jest wiele innych operacji oprócz zatwierdzenia, na które HEAD ma wpływ. Naprawdę, w końcu, HEAD HEAD, a jej charakter jest określony przez jak to wpływa na polecenia jak commit, merge, rebase, log, itd. Ale koncepcyjnie może „(wskaźnik) aktualną pozycję” jest podsumowaniem dobre.
LarsH
3

Wygląda na to, że HEADto tylko tag ostatniego zatwierdzenia, które sprawdziłeś.

Może to być końcówka określonej gałęzi (np. „Master”) lub pośrednia zmiana gałęzi („odłączona głowa”)

Vertexwahn
źródło
1

Oprócz wszystkich definicji, w mojej głowie zapadła myśl, że kiedy dokonujesz zatwierdzenia, GIT tworzy obiekt zatwierdzenia w repozytorium. Obiekty zatwierdzania powinny mieć element nadrzędny (lub wielu rodziców, jeśli jest to zatwierdzenie scalania). Skąd więc git zna element nadrzędny bieżącego zatwierdzenia? Zatem HEAD jest wskaźnikiem do (odniesienia) ostatniego zatwierdzenia, które stanie się rodzicem bieżącego zatwierdzenia.

Anwar Husain
źródło
0

Te dwa mogą cię mylić:

głowa

Wskazując na nazwane referencje, które niedawno przesłał oddział. O ile nie użyjesz odwołania do pakietu, głowice zwykle przechowywane są w $ GIT_DIR / refs / heads /.

GŁOWA

Bieżąca gałąź lub twoje drzewo robocze jest zwykle generowane z drzewa, na które wskazuje HEAD. HEAD musi wskazywać na głowę, chyba że używasz odłączonej HEAD.

Marcus Thornton
źródło
0

Spójrz na http://git-scm.com/book/en/Git-Branching-What-a-Branch-Is

Rycina 3-5. Plik HEAD wskazujący gałąź, w której się znajdujesz.

Ting Wang
źródło
4
Odpowiedzi tylko na link są na ogół zniechęcone na Stackoverflow, proszę wstawić odpowiednie informacje w odpowiedzi.
HaskellElephant
2
To nie jest do końca poprawne. To, co HEADodnosi się do, zależy od tego, czy mówisz o repozytorium nagim czy nie-nagim. W kontekście repozytorium non-bare, efektywnie odnosi się do aktualnie wyrejestrowanego zatwierdzenia, które nie wymaga dołączenia do niego gałęzi (tj. Gdy jest w HEADstanie odłączonym ).
0

Oddział jest w rzeczywistości wskaźnik, który trzyma popełnić identyfikator takie jak 17a5 . HEAD jest wskaźnikiem do gałęzi, nad którą użytkownik aktualnie pracuje.

HEAD ma plik referencyjny, który wygląda następująco:

ref:

Możesz sprawdzić te pliki, uzyskując dostęp .git/HEAD .git/refsdo repozytorium, w którym pracujesz.

Ok
źródło
0

Gitchodzi o zobowiązania.
I Headwskazuje na zatwierdzenie, które aktualnie wypisałeś.

$ git cat-file -t HEAD
commit

Ilekroć kasujesz gałąź, HEAD wskazuje na ostatnie zatwierdzenie w tej gałęzi. Zawartość HEAD można sprawdzić jak poniżej (dla gałęzi master):

$ cat .git/refs/heads/master
  b089141cc8a7d89d606b2f7c15bfdc48640a8e25
SR Chaitanya
źródło
-5

Jako koncepcja szef jest najnowszą wersją w oddziale. Jeśli masz więcej niż jedną głowę na nazwaną gałąź, prawdopodobnie utworzyłeś ją podczas wykonywania lokalnych zatwierdzeń bez łączenia, skutecznie tworząc gałąź bez nazwy.

Aby mieć „czyste” repozytorium, powinieneś mieć jedną głowę na nazwaną gałąź i zawsze łączyć się z nazwaną gałąź po pracy lokalnej.

Dotyczy to również Mercurial .

dukeofgaming
źródło
4
Dotyczy to Mercurial, ale nie Git.
Przywróć Monikę - notmaynard