Czym jest HEAD in Git?

Widzisz dokumentację Gita mówiącą takie rzeczy jak

Gałąź musi być całkowicie połączona w głowę.

Ale czym dokładnie jest Git HEAD?

 855
git
Author: nbro, 2010-02-21

16 answers

Możesz myśleć o głowie jako o "bieżącej gałęzi". Gdy zmieniasz gałęzie za pomocą git checkout, zmiana głowicy zmienia się tak, aby wskazywała na końcówkę nowej gałęzi.

Możesz zobaczyć, na co głowa wskazuje, robiąc:

cat .git/HEAD

W moim przypadku wyjście to:

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

Możliwe jest, aby HEAD odnosił się do konkretnej rewizji, która nie jest powiązana z nazwą gałęzi. Ta sytuacja nazywa się odłączoną głową.

 634
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-20 23:00:49

Cytuję inni ludzie :

Głowa jest po prostu odniesieniem do Zatwierdź obiekt. Każda głowa ma imię (nazwa gałęzi lub nazwa znacznika itp.). Przez domyślnie, jest głowa w każdym repozytorium o nazwie master. Repozytorium może zawierać dowolną liczbę głowic. Na w dowolnym momencie wybiera się jedną głowicę jako " obecna Głowa."Ta głowa jest aliased to HEAD, always in capitals".

Zauważ tę różnicę: "Głowa" (małe litery) odnosi się do dowolnego z nazwane głowy w repozytorium; " Głowa" (wielkie litery) odnosi się wyłącznie do obecnie aktywny kierownik. To rozróżnienie jest często używane w Git dokumentacja.

Inne dobre źródło, które szybko obejmuje wewnętrzne działanie Gita (i dzięki temu lepsze zrozumienie heads/HEAD) można znaleźć tutaj . Referencje (ref:) lub nagłówki lub gałęzie mogą być traktowane jak notatki post-it przyklejone do commitów w historii zmian. Zwykle wskazują na końcówkę serii commitów, ale można je przemieszczać z git checkout lub git revert itd.

 150
Author: Silfheed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-07 23:25:48

Polecam tę definicję od dewelopera Githuba Scotta Chacona [video reference]:

Głowa to twoja obecna gałąź. Jest to odniesienie symboliczne. Jest to odniesienie do gałęzi. Zawsze masz głowę, ale głowa będzie wskazywać na jeden z tych innych wskaźników, na jedną z gałęzi, na której jesteś. Jest rodzicem Twojego kolejnego commita. Jest to, co powinno być tym, co zostało ostatnio sprawdzone w katalogu roboczym... Jest to ostatni znany stan tego, co działa katalog był.

Cały filmik będzie rzetelnym wprowadzeniem do całego systemu git, więc polecam również obejrzeć go wszystko, jeśli masz na to czas.

 45
Author: jasoares,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-18 16:21:23

HEAD jest tylko specjalnym wskaźnikiem, który wskazuje lokalny oddział, na którym aktualnie się znajdujesz.

Z książki Pro Git, Rozdział 3.1 rozgałęzienia Git-gałęzie w skrócie, w sekcji Tworzenie nowej gałęzi :

Co się stanie, jeśli utworzysz nową gałąź? W ten sposób powstaje nowa wskaźnik do poruszania się. Powiedzmy, że tworzysz nową gałąź nazywa się testowaniem. Robisz to poleceniem Git branch:

$ git branch testing 

To tworzy nowy wskaźnik w tym samym zatwierdzeniu, w którym aktualnie się znajdujesz

Tutaj wpisz opis obrazka

Skąd Git wie, na której gałęzi aktualnie jesteś? Posiada specjalny wskaźnik zwany głową. Zauważ, że to znacznie różni się od pojęcie głowy w innych VCSs, do których można się przyzwyczaić, np. Subversion lub CVS. W Git jest to wskaźnik do lokalnej gałęzi aktualnie jesteś na stronie. W tym przypadku, nadal jesteś na mistrzu. Git Komenda branch utworzyła tylko nową gałąź - nie przełączyła się na tę branch.

Tutaj wpisz opis obrazka

 39
Author: Alexandr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 20:24:54

Jeśli nie jest to szczególny przypadek zwany "odłączoną głową", to, jak stwierdzono w O ' Reilly Git book, 2nd edtion, str. 69, HEAD oznacza:

HEAD zawsze odnosi się do najnowszego commita na bieżącym branch. Gdy zmieniasz gałęzie, HEAD jest aktualizowany, aby odnosić się do nowego najnowszy commit Brancha.

Więc

HEAD jest "końcówką" bieżącej gałęzi.

Zauważ, że możemy użyć HEAD aby odwołać się do najnowszego commita i użyj {[5] } jako commit przed końcówką, a HEAD~~ lub HEAD~2 jako commit jeszcze wcześniej itd.

 28
Author: 太極者無極而生,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-10 12:01:08

HEAD odnosi się do aktualnego commita, na który wskazuje kopia robocza, tzn. do zatwierdzonego przez Ciebie commita. Z oficjalnej dokumentacji jądra Linuksa na temat określania wersji Git :

HEAD określa commit, na którym oparto zmiany w drzewie roboczym.

Zauważ jednak, że w nadchodzącej wersji 1.8.4 Git, @ może być również używany jako skrót HEAD, jak zauważył[15]}współpracownik Git Junio C Hamano w jego Git Blame blog :

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

Użytkownik Stack Overflow VonC znalazł również kilka interesujących informacji, dlaczego @ został wybrany jako skrót w odpowiedzi na inne pytanie.

Interesujące jest również to, że w niektórych środowiskach nie jest konieczne pisanie wielkimi literami HEAD, szczególnie w systemach operacyjnych, które używają systemów plików niewrażliwych na wielkość liter, w szczególności Windows i OS X.

 19
Author: Community,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:48

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

HEAD jest w rzeczywistości plikiem, którego zawartość określa, gdzie odnosi się zmienna HEAD:

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

W tym repozytorium zawartość pliku głównego odnosi się do drugiego pliku o nazwie refs/heads/master. Plik refs/heads/master zawiera hash najnowszego commita w gałęzi master.

Wynik jest taki, że HEAD wskazuje na commit gałęzi master z .git/refs/heads / master plik.

Tutaj wpisz opis obrazka

 14
Author: onmyway133,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-09 07:25:50

Chciałbym tylko wyszczególnić kilka rzeczy w zaakceptowanej odpowiedzi Grega Hewgila. Zgodnie z Git Pocket Guide

Branża:

Sama gałąź jest zdefiniowana jako wszystkie punkty osiągalne w commicie Wykres z nazwanego commita ("końcówki" gałęzi).

HEAD: specjalny typ Ref

Specjalna głowica ref określa, na której gałęzi jesteś...

Refs

Git definiuje dwa rodzaje odniesień, czyli nazwane wskaźniki, które nazywa "refs": {]}

    W przeciwieństwie do innych obiektów, które nie są w pełni kompatybilne z innymi obiektami, nie są w pełni kompatybilne z innymi obiektami.]} W przeciwieństwie do symref-a, nie jest on w pełni automatyczny i nie jest w pełni automatyczny.]}

Jak wspomniał Greg, głowa może być w "stanie oderwanym". Tak więc HEAD może być albo prostym ref (dla odłączonej głowicy) albo symref.

Jeśli HEAD jest symbolicznym ref dla istniejącej gałęzi, to "on" ta gałąź. Jeśli natomiast HEAD jest prostym refem bezpośrednio nazywając commit przez jego ID SHA-1, wtedy nie jesteś " na " żadnej gałęzi, ale raczej w trybie "wolnostojącej głowy", co dzieje się po sprawdzeniu niektórych wcześniej zobowiązać się do zbadania.

 10
Author: mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-05 23:54:58

Myślę ,że 'głowa' jest aktualna sprawdź commit. Innymi słowy 'HEAD' wskazuje na commit, który jest aktualnie sprawdzany.

Jeśli właśnie sklonowałeś i nie sprawdziłeś Nie wiem Do czego to wskazuje, prawdopodobnie jakaś Nieprawidłowa lokalizacja.

 5
Author: Nataraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-18 09:57:29

Świetny sposób, aby wrócić do domu punkt w poprawnych odpowiedziach jest biegać git reflog HEAD, dostajesz historię wszystkich miejsc, które wskazała Głowa.

 4
Author: tjb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-12 19:27:21

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

HEAD: wskaźnik do ostatniej migawki zatwierdzania, następny rodzic

Głowica w Git jest wskaźnikiem do bieżącej gałęzi, która z kolei jest wskaźnikiem do ostatniego commita, który wykonałeś lub ostatniego commita, który został wypisany w Twoim katalogu roboczym. Oznacza to również, że będzie rodzicem następnego commita. Ogólnie rzecz biorąc, najprościej jest myśleć o tym, że HEAD jest migawką ostatniego commita.

 4
Author: user3751385,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-27 15:42:41

Head wskazuje na czubek aktualnie sprawdzanej gałęzi.

Tutaj wpisz opis obrazka

W Twoim repozytorium znajduje sięfolder git. Otwórz plik w tej lokalizacji: .git \ refs\heads. Kod (SHA-1 hash) w tym pliku (master w większości przypadków) będzie najnowszym commitem, tzn. wyświetlanym na wyjściu polecenia git log. Więcej informacji na temat .katalog git: http://gitready.com/advanced/2009/03/23/whats-inside-your-git-directory.html

 4
Author: stack1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-13 19:43:02

Wydaje mi się, że HEAD jest tylko tagiem ostatniego commita, który sprawdzałeś.

Może to być końcówka określonej gałęzi (np. "master") lub część pomiędzy zatwierdzeniem gałęzi ("wolnostojąca Głowa")
 1
Author: Vertexwahn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-15 01:10:54

Ci dwaj mogą was pomylić:

Head

Wskazanie nazwanych referencji niedawno przesłanej gałęzi. Jeśli nie używasz referencji pakietu , heads zazwyczaj jest przechowywany w $ GIT_DIR/refs/heads/.

HEAD

Bieżąca gałąź, lub twoje drzewo robocze jest zwykle generowane z głowy drzewa wskazuje na. Głowa musi wskazywać na głowę, z tym wyjątkiem, że używasz odłączonej głowy.

 0
Author: Marcus Thornton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-16 12:26:04

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

Rysunek 3-5. Nagłówek wskazuje na gałąź, na której się znajdujesz.

 -1
Author: Ting Wang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-07 20:27:52

Jako koncepcja, głowa jest najnowszą rewizją w gałęzi. Jeśli masz więcej niż jedną gałąź na nazwaną gałąź, prawdopodobnie utworzyłeś ją podczas wykonywania lokalnych commitów bez scalania, co skutecznie tworzy nienazwaną gałąź.

Aby mieć "czyste" repozytorium, powinieneś mieć jedną głowicę na nazwaną gałąź i zawsze scalić się do nazwanej gałęzi po tym, jak pracowałeś lokalnie.

Dotyczy to również Mercurial .

 -4
Author: dukeofgaming,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-26 20:44:07