Почему git использует две разные команды для отображения HEAD?

Я заметил, что есть 2 HEAD:

  • .git\ГОЛОВА
  • .git\рефов\перепятнышки\происхождение\ГОЛОВА

Когда я использую git show-ref HEAD, он только дает мне это:

ce0762c073b407d794f54f0b5d2a50375fdcb609 refs/remotes/origin/HEAD

Когда я использую git rev-parse HEAD, он дает мне значение .git\HEAD:

a758e523fe40e799194878bac567b7f4b8eec2b9

Почему Git используют две разные команды для отображения HEAD? Любая сильная причина?

Ответ 1

git-show-ref показывает список ссылок в вашем репозитории и их идентификаторы фиксации. Вероятно, его следует назвать git-show-refs. Он предпочитал напрямую ссылаться на файлы в каталоге .git.

Когда вы скажете git show-ref HEAD, вы не просите HEAD. То, что вы просите, это любые ссылки в списке, которые соответствуют шаблону HEAD. HEAD сам обычно отфильтровывается, поэтому вы получаете refs/remotes/origin/HEAD. Вы можете включить HEAD с помощью --head.

$ git show-ref --head HEAD
f37beeea95f3b0e6b064f6d4b5f835a058e0568c HEAD
aa1124b89f38eed793e2b9f2d2b2ba5d80a27a20 refs/remotes/origin/HEAD

Поэтому вы не должны использовать git show-ref <ref> для поиска ссылок.


git-rev-parse принимает параметр ревизии и возвращает идентификатор фиксации. Это означает иметь дело с множеством разных способов, которыми вы можете ссылаться на фиксацию. Например...

$ git rev-parse --verify master
aa1124b89f38eed793e2b9f2d2b2ba5d80a27a20
$ git rev-parse --verify heads/master
aa1124b89f38eed793e2b9f2d2b2ba5d80a27a20
$ git rev-parse --verify refs/heads/master
aa1124b89f38eed793e2b9f2d2b2ba5d80a27a20

git rev-parse --verify <ref> - это то, что вы должны использовать для поиска идентификатора фиксации ссылки.

Ответ 2

.git/HEAD используется Git для хранения текущего ref. Поэтому, когда вы находитесь на master, это будет ref: refs/heads/master. Когда вы находитесь на detached HEAD, это будет хеш-фиксация.

.git/refs/remotes/origin/HEAD на самом деле является удаленным ref, который указывает на ветвь по умолчанию на удаленном компьютере. Когда master является удаленной ветвью по умолчанию, это будет ref: refs/remotes/origin/master (если ваш пульт - это источник). Возможно иметь удаленную ветвь по умолчанию, отличную от master, но я заметил, что она не будет правильно отражать это.

Но

$ git remote show github

всегда укажет правильную удаленную ветку по умолчанию.

Подробнее см. этот ответ Как установить источник /HEAD?.

git show-ref показывает вам ссылки, которые являются локальными ветвями, удаленными ветвями, тегами, сообщениями с привязкой.

С

git show-ref HEAD

Git использует "HEAD" как шаблон

git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference]
         [-s|--hash[=<n>]] [--abbrev[=<n>]] [--tags]
         [--heads] [--] [<pattern>…​]

и отображаются только те ссылки, которые соответствуют.

См. git -show-ref doc.

В основном я использую git branch с параметрами -a или -r, чтобы видеть ветки, git tag, чтобы видеть теги, и редко использовать git show-ref.