Ответ 1
Это уже в комментариях к другому ответу до сих пор, но это совершенно нормально: новый репозиторий, "голый" или нет, не имеет коммитов, поэтому он также не имеет ссылок.
Он имеет HEAD
, который представляет собой файл с именем HEAD
в репозитории (каталог .git
), содержащий ссылку на название символической ветки. Если вы cat HEAD
, вы увидите ref: refs/heads/master
, что означает, что новый репозиторий "на главном ветки", даже если мастер ветвления еще не существует. Опять же, это совершенно нормальное положение вещей. На данный момент вас называют "на неродившейся ветке".
Когда вы добавляете одну или несколько коммитов в этот пустой репозиторий, ветвь master
может, если это голое репо, вы можете добавить это через git push
, которая может не содержать ветвь master
, поэтому не допускайте скажем, "делает":-), хотя обычно master
действительно возникает в этой точке, с ссылкой, указывающей на новую фиксацию (или новое накопление накопления цепочки коммитов).
В любом репо (голое или нет, снова) вы можете быть "on" ветвью, которая не существует. В частности, в обычном репо вы можете сделать:
$ git checkout --orphan newbranch
который помещает вас "on" newbranch
(путем записи ref: refs/heads/newbranch
в HEAD
) без фактического создания newbranch
, тем самым делая newbranch
"нерожденным ветвью". Следующая фиксация приводит к появлению newbranch
, и это commit не имеет родительских коммитов (следовательно, часть --orphan
): это новый корневой фиксатор. Точно так же master
возникает при его первом фиксации.
Если вам нравится, вы можете посмотреть на него с точки зрения основного механизма: когда git создает новую фиксацию, шаги, используемые для обновления HEAD
, выглядят следующим образом: 1
- Прочитайте содержимое файла
HEAD
. - Является ли это символом ref, например
ref: refs/heads/master
? если да, переходите к шагу 4. - Нет (случай "отсоединенный HEAD" ): создайте фиксацию с родителем, указанную идентификатором commit в
HEAD
, и напишите новый SHA-1 вHEAD
. Остановитесь, мы закончили. - Прочитайте SHA-1 упомянутой ветки (например,
.git/refs/heads/master
или из упакованных ссылок). - Если SHA-1 недоступен, потому что ветка еще не существует, создайте корневую фиксацию, иначе создайте фиксацию, чей родитель является данным SHA-1. Напишите новый SHA-1 в ответную ветвь. Остановитесь, мы закончили.
Как интересно отметить, когда refs упаковываются, "активные" (например, независимо от того, какая ветка вы разрабатываете, скажем, devel
, например) завершаемся в .git/packed-refs
, но быстро обновляются новыми значениями, Эти новые значения идут только в файле .git/refs/heads/devel
: в файле .git/packed-refs
сохраняется запись refs/heads/devel
, но она устарела (и, следовательно, игнорируется). (Вы не должны зависеть от этого: внешние программы, такие как shell-скрипты, должны использовать git branch
или git update-ref
или git symbolic-ref
, если это необходимо, для чтения и записи имен ссылок и значений SHA-1. тем не менее, полезно иметь возможность напрямую входить и редактировать ссылки. Подумайте об этом как о современном эквиваленте шестнадцатеричного редактора для дисковых секторов.:-))
1 Все это предполагает, что вы не создаете фиксацию слияния. Если вы находитесь в середине слияния, другой файл в репозитории (.git/MERGE_HEAD
) предоставляет дополнительные идентификаторы родительских слияний.