Запрос на git HEAD - PullRequest
       3

Запрос на git HEAD

0 голосов
/ 20 мая 2019

Я задаю этот вопрос, чтобы понять детали реализации git, поэтому я могу ошибаться с технической точки зрения.

Проходя по книге git scm, я понимаю, что HEAD может указывать на ветку (которая сама по себе являетсяуказатель на коммит).а также совершить.

Таким образом, HEAD может указывать на два объекта разных типов.

Возможно ли, чтобы указатель указывал на объекты различных типов (фиксация и переход не связаны между собой с точки зрения иерархии)

1 Ответ

2 голосов
/ 20 мая 2019

В техническом, но совершенно конкретном смысле, HEAD - это файл, .git/HEAD. Он содержит либо:

  • название филиала или
  • идентификатор хеша коммита.

Когда HEAD содержит хэш-идентификатор коммита, это все, что у него есть. Git называет эту ситуацию detached HEAD , и единственной доступной информацией является хеш-идентификатор коммита.

Когда HEAD содержит название ветви, теперь у вас есть два способа спросить Git об этом:

  • Эй, Git, скажи мне, какой хэш-идентификатор HEAD names. Git смотрит на HEAD, видит, что он называет master, затем смотрит на master, чтобы увидеть, что ID хеша master имен. Это ответ на ваш вопрос.

  • Или Эй, Git, скажи мне, какую ветку HEAD называет. Git смотрит на HEAD, видит, что она называет master, и говорит master как ответ на ваш вопрос.

Каждое имя ветви всегда содержит хэш-идентификатор ровно одного коммита, поэтому, если HEAD содержит имя ветви, Git всегда может выполнить операцию HEAD -to-hash-ID, выполнив два шага. Однако, когда HEAD содержит необработанный хэш-идентификатор, попытка спросить Git, какое имя ветки он содержит, выдает ошибку:

$ git checkout --detach master
HEAD is now at 83232e3864 The seventh batch
$ git symbolic-ref HEAD
fatal: ref HEAD is not a symbolic ref

или, используя git rev-parse --symbolic-full-name, просто печатает HEAD:

$ git rev-parse --symbolic-full-name HEAD
HEAD

Повторное присоединение HEAD к master приводит к тому, что оба они дают имена ветвей:

$ git checkout master
Switched to branch 'master'
$ git symbolic-ref HEAD
refs/heads/master
$ git rev-parse --symbolic-full-name HEAD
refs/heads/master

Вот так HEAD может быть либо именем ветви, либо хэшем коммита, кроме случаев, когда это может быть только хэш коммита.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...