Разница между головой и мастером

189

Какая разница между HEADи masterв Git?

Я сделал клон проекта на GitHub и хочу перенести свои изменения на пульт. Но к чему я должен подталкивать?

Скриншот

Фредерик Хейнинк
источник

Ответы:

162

masterэто ссылка на конец ветки. По соглашению (и по умолчанию) это обычно основная ветвь интеграции, но это не обязательно.

HEADна самом деле это особый тип ссылки, который указывает на другую ссылку. Это может указывать master или не может (это будет указывать на то, какая ветвь в настоящее время извлечена). Если вы знаете, что хотите принять участие в masterветке, нажмите на это.

Вот наглядный пример:

альтернативный текст

В вашем собственном репозитории вы можете проверить, куда HEADуказывает указатель, запустив это:

$ git symbolic-ref HEAD
refs/heads/master

Однако выяснить, куда remotes/origin/HEADуказывает указатель, сложнее, поскольку он находится на удаленной машине.

Здесь есть отличный небольшой учебник по ссылкам на git:

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

Ли Нетертон
источник
1
+1 Более точный ответ, чем мой. См. Также stackoverflow.com/questions/3301956/… и stackoverflow.com/questions/3301956/… для иллюстрации вокруг этих концепций.
VonC
37

Простой ответ - HEADэто указатель / метка для самого последнего коммита ветки, в которой вы находитесь. masterявляется веткой по умолчанию, созданной при инициализации git-репозитория (например git init).

Вы можете удалить masterветку (например git branch -D master). Вы не можете удалить HEADуказатель.

benhorgen
источник
6
HEADmsgstr " это указатель / метка для самого последнего коммита ветки, в которой вы сейчас находитесь." Я думаю, что это в лучшем случае вводит в заблуждение. Если вы извлекаете более старый коммит, то HEAD теперь является указателем на этот более старый коммит, а не на самый последний коммит. Правильно?
LarsH
2
Ты прав. ГОЛОВА - ваша последняя проверка. Но в мою защиту, для Git, checkoutкоманда эквивалентна переключению ветвей в других распространенных системах SCM.
Бенхорген
1
Я сочувствую ... Я мог легко сделать ту же ошибку. Единственная причина, по которой я это заметил, заключалась в том, что я нахожусь на стадии попытки выяснить, что на самом деле означает HEAD. Есть ли шанс, что вы сможете отредактировать свой ответ, чтобы он был правильным? Я считаю, что HEAD - это сложная концепция, чтобы найти точные описания для таких неопытных людей, как я. А наличие в интернете советов, которые дают неверную информацию о HEAD, делает его немного сложнее.
LarsH
2
Я думаю, что ваш комментарий является фантастическим разъяснением для любого, кто ищет более глубокое понимание того, что на HEADсамом деле является указателем Git . Я ценю ваш комментарий и думаю, что другие тоже. Содержимое моего оригинального сообщения и ваш комментарий дополняют друг друга. Спасибо.
Бенхорген
4
Техническая сложность, но если вы извлекаете более старый коммит, вы больше не «на ветке». Если вы извлекаете коммит вместо ветки, у вас есть то, что называется «отсоединенным HEAD», вы больше не «на ветке». Находясь «на ветке» означает, что ваш HEAD ссылается на ветку, и по определению вы находитесь на самом последнем коммите этой ветки. Тот факт, что вы зафиксировали коммит 'b54fe7' и мастер указывает на этот коммит, не означает, что вы находитесь в главной ветке. Может быть несколько веток, указывающих на один и тот же коммит, вы находитесь на том, на который указывает HEAD, если он есть.
Джейсон Гомаат
8

Просто нажмите изменения вашей текущей ветви

git push origin

и это подтолкнет вашу ветку ' B' изменения к ' origin/B'.
Если вы находитесь на своей masterветке, git будет нажимать на origin/master.
На самом деле он будет помещать все изменения в локальные ветви, в которых есть соответствующие удаленные ветви origin. Это контролируется настройкой конфигурации push.default .
Также смотрите описание RefSpecs в книге Pro Git .


То, что вы видите, является боковой панелью, представляющей все refspecs вашего удаленного репо в Experimental GitX fork проекта GitX .

альтернативный текст

HEADБудет обозначать ветвь по умолчанию для этого пульта дистанционного управления.
Смотрите git remote set-headсправочную страницу :

Наличие ветки по умолчанию для удаленного не требуется, но позволяет указать имя удаленного вместо конкретной ветви.
Например, если для ветви по умолчанию originзадано значение master, то originможет быть указано везде, где вы обычно указываете origin/master.

VonC
источник