Różnica między HEAD a master

188

Jaka jest różnica między HEADimaster Gitem Gitem?

Zrobiłem klon projektu na GitHub i chcę przekazać moje zmiany do pilota. Ale do którego powinienem naciskać?

zrzut ekranu

Frederik Heyninck
źródło

Odpowiedzi:

162

masterjest odniesieniem do końca gałęzi. Zgodnie z konwencją (i domyślnie) jest to zwykle główna gałąź integracji, ale nie musi tak być.

HEADjest w rzeczywistości specjalnym rodzajem odniesienia, które wskazuje na inne odniesienie. Może wskazywać master lub nie (wskaże, który oddział jest aktualnie wyewidencjonowany). Jeśli wiesz, że chcesz zobowiązać się domaster oddziału, popchnij do tego.

Oto wizualny przykład:

alternatywny tekst

W swoim własnym repozytorium możesz sprawdzić, do kogo HEADwskazuje, uruchamiając to:

$ git symbolic-ref HEAD
refs/heads/master

Jednak znalezienie miejsca, na które remotes/origin/HEADwskazuje, jest trudniejsze, ponieważ znajduje się na zdalnym komputerze.

Tutaj jest świetny mały samouczek na temat referencji git:

http://people.gnome.org/~federico/news-2008-11.html#pushing-and-pulling-with-git-1

Lee Netherton
źródło
1
+1 Bardziej precyzyjna odpowiedź niż moja. Zobacz także stackoverflow.com/questions/3301956/... i stackoverflow.com/questions/3301956/..., aby zapoznać się z ilustracjami dotyczącymi tych pojęć.
VonC
37

Prosta odpowiedź brzmi: HEADwskaźnik / etykieta do ostatniego zatwierdzenia gałęzi, w której aktualnie się znajdujesz. masterto domyślna gałąź tworzona podczas inicjowania repozytorium git (np git init.).

Możesz usunąć mastergałąź (np git branch -D master.). Nie można usunąć HEADwskaźnika.

benhorgen
źródło
6
HEADto wskaźnik / etykieta do ostatniego zatwierdzenia gałęzi, w której aktualnie jesteś.” Myślę, że to w najlepszym razie wprowadza w błąd. Jeśli kasujesz starsze zatwierdzenie, HEAD jest teraz wskaźnikiem do tego starszego zatwierdzenia, a nie do ostatniego zatwierdzenia. Dobrze?
LarsH
2
Masz rację. HEAD jest Twoim ostatnim kasie. Ale w mojej obronie dla Gita checkoutpolecenie jest równoważne przełączaniu gałęzi w innych popularnych systemach SCM.
benhorgen
1
Współczuję ... Z łatwością mogłem popełnić ten sam błąd. Jedynym powodem, który zauważyłem, było to, że jestem na etapie badań nad tym, co naprawdę oznacza HEAD. Czy jest jakaś szansa na poprawienie odpowiedzi? Uważam, że HEAD jest trudnym pojęciem do znalezienia dokładnych opisów, dla nie-ekspertów git jak ja. Posiadanie porad w Internecie, które zawierają nieprawidłowe informacje na temat HEAD, sprawia, że ​​jest to nieco trudniejsze.
LarsH
2
Myślę, że twój komentarz jest fantastycznym wyjaśnieniem dla każdego, kto szuka lepszego zrozumienia tego, czym HEADtak naprawdę jest wskaźnik Git . Doceniam twój komentarz i myślę, że inni też. Treść mojego oryginalnego postu wraz z komentarzem uzupełniającym się uzupełniają. Dzięki.
benhorgen,
4
Technicznie, ale jeśli kasujesz starsze zatwierdzenie, nie jesteś już w gałęzi. Jeśli wypisujesz zatwierdzenie zamiast gałęzi, masz tak zwaną „odłączoną HEAD”, nie jesteś już „w gałęzi”. Bycie „na gałęzi” oznacza, że ​​HEAD odnosi się do gałęzi i z definicji jesteś na ostatnim zatwierdzeniu tej gałęzi. To, że masz wypisane „b54fe7” i punkty główne do tego zatwierdzenia, nie oznacza, że ​​jesteś w gałęzi master. Może istnieć kilka gałęzi wskazujących na to samo zatwierdzenie, jesteś „na” tym, na który wskazuje HEAD, jeśli istnieje.
Jason Goemaat,
8

Po prostu wciśnij zmiany swojego obecnego oddziału

git push origin

i popchnie B„zmiany twojego oddziału do origin/B”.
Jeśli jesteś w masteroddziale, git będzie naciskać na origin/master.
W rzeczywistości wypchnie wszystkie zmiany w lokalnych oddziałach, które mają pasujące zdalne oddziały w origin. Jest kontrolowany przez ustawienie konfiguracyjne push.default .
Zobacz także wypychanie RefSpecs w książce Pro Git .


Co widzisz jest sidebar reprezentujących wszystkie refspecs swojej zdalnego repo w rozwidleniu Experimental GitX w projekcie GitX .

alternatywny tekst

HEADWyznaczy domyślny oddział dla tego pilota.
Zobacz git remote set-headstronę podręcznika :

Posiadanie domyślnej gałęzi dla pilota nie jest wymagane, ale umożliwia określenie nazwy pilota zamiast określonej gałęzi.
Na przykład, jeśli domyślna gałąź dla originjest ustawiona na master, to originmożna ją podać tam, gdzie normalnie byś ją określił origin/master.

VonC
źródło