Вот при вызове команды 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»), то именно этот коммит сейчас и распакован в вашем рабочем каталоге
Комментариев нет:
Отправить комментарий