Вот при вызове команды git branch -a получаю такой вывод aleksey@aleksey:~/Downloads/NTZ/FittingRoom$ git branch -a develop * master remotes/origin/HEAD -> origin/master remotes/origin/master Ветка develop и master понятно, что это 2 мои локальные ветки, но понятно, что такое remotes/origin/HEAD -> origin/master remotes/origin/master Это удаленные ветки, но в чем их отличия и почему одна HEAD ... Я так понял, что head это та ветка в которую я делаю пуш, но так это должна быть master... Я так понимаю, что это должно выглядеть так aleksey@aleksey:~/Downloads/NTZ/FittingRoom$ git branch -a develop * master remotes/origin/master 2 ветки локальные и одна master удаленная... Зачем head? ПРАВКА. Добавил еще ветку origin/develop и после выполнения команды git checkout origin/develop получаю вот такой вывод через git branch -a aleksey@aleksey:~/Downloads/NTZ/FittingRoom$ git branch -a * (detached from origin/develop) develop master remotes/origin/HEAD -> origin/master remotes/origin/develop remotes/origin/master Я так понял, что HEAD может указывать только на ветки удаленного репазитория... Но почему тогда после переключения на удаленную ветку дев стока HEAD все равно указывает на мастер?? remotes/origin/HEAD -> origin/master Вот согласно статье на хабре текущее состояние не изменённых файлов, находящихся под контролем версий, есть тот коммит, на который указывает HEAD ниче не понятно, HEAD в итоге указывает на ту ветку где ты находится или на ветку в которую ты сделал последний коммит?
Ответ ветка (branch) в git — это (плавающий) указатель на commit. HEAD/.git/HEAD (технически) — это файл, содержащий указатель либо на текущую (для репозитория) ветку (например, файл может содержать такой текст ref: refs/heads/master), либо на текущий commit (т.н. detached head, файл содержит строку с хэш-суммой этого commit-а). удалённый репозиторий ничем не «хуже» вашего локального, и в нём тоже есть такой файл, и информация, выдаваемая командой branch: remotes/origin/HEAD -> origin/master сообщает вам о том, что этот файл в удалённом репозитории в момент клонирования содержал ссылку на ветку master (в том же, удалённом репозитории).
Я так понял, что head это та ветка в которую я делаю пуш push вы делаете в ту ветку, которую сами и указали. либо явно, например так: $ git push репозиторий ветка либо неявно, «привязав» вашу локальную ветку к (произвольной) ветке в удалённом репозитории, и вызывая git push без дополнительных параметров. посмотреть «привязки» веток можно, например, командой remote show репозиторий: $ git remote show origin ... Local branch configured for 'git pull': master merges with remote master Local ref configured for 'git push': master pushes to master (up to date)
по поводу дополнения к вопросу во-первых, я уже ответил практически на тот же вопрос: Почему получаю detached head?. во-вторых, вынесу (и дополню) сюда основное: эта строка (remotes/origin/HEAD -> origin/master) в выдаче команды branch появляется благодаря наличию в вашем локальном хранилище файла refs/remotes/origin/HEAD, содержащего в вашем случае: $ cat .git/refs/remotes/origin/HEAD ref: refs/remotes/origin/master вы можете абсолютно безболезненно удалить этот файл. тогда эта строчка пропадёт из вывода команды branch. файл этот был создан во время клонирования и содержит информацию о том, какая именно ветка была распакована при этом в ваш рабочий каталог. вероятно, вы спутали этот файл (.git/refs/remotes/origin/HEAD) с файлом .git/HEAD, который как раз и содержит ссылку на вашу текущую ветку (или на коммит, если ваше хранилище находится в «состоянии detached head»). Я так понял, что HEAD может указывать только на ветки удаленного репазитория. нет. файл .git/HEAD может хранить: либо указатель на локальную ветку (т.е., содержать что-то вроде ref: refs/heads/master) либо хэш коммита (т.н. «состояние detached head») Но почему тогда после переключения на удаленную ветку дев стока HEAD все равно указывает на мастер? remotes/origin/HEAD -> origin/master ещё раз повторяю: эта строка в выводе команды branch появляется лишь по одной причине — из-за наличия файла .git/refs/remotes/origin/HEAD. этот файл ни на что не влияет. вы его можете абсолютно безболезненно удалить. и тогда этой строки уже не будет в выводе команды branch. Вот согласно статье на хабре текущее состояние не изменённых файлов, находящихся под контролем версий, есть тот коммит, на который указывает HEAD ниче не понятно, HEAD в итоге указывает на ту ветку где ты находится или на ветку в которую ты сделал последний коммит? последний коммит здесь абсолютно ни при чём. если файл .git/HEAD содержит указатель на локальную ветку (т.е., содержит что-то вроде ref: refs/heads/master), то, значит, у вас в рабочем каталоге распакован коммит, на который указывает локальная ветка master. хэш этого коммита хранится в файле .git/refs/heads/master если же файл .git/HEAD содержит хэш коммита (т.н. «состояние detached head»), то именно этот коммит сейчас и распакован в вашем рабочем каталоге.