Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions book/10-git-internals/sections/refs.asc
Original file line number Diff line number Diff line change
Expand Up @@ -62,21 +62,21 @@ fdf4fc3344e67ab068f836878b6c4951e3b15f3d First commit
.Объекты в каталоге .git, а также указатели на вершины веток
image::images/data-model-4.png["Объекты в каталоге .git, а также указатели на вершины веток"]

При выполнении команды `git branch <branch>`, в действительности Git запускает команду `update-ref`, которая добавляет SHA-1 хеш последнего коммита текущей ветки в файл с именем указанной ветки.
При выполнении команды `git branch <branch>` Git в действительности запускает команду `update-ref`, которая добавляет SHA-1-хеш последнего коммита текущей ветки в файл с именем указанной ветки.

[[r_the_head]]
==== HEAD

Как же Git получает хеш последнего коммита при выполнении `git branch <имя ветки>`?
Ответ кроется в файле HEAD.

Файл HEAD -- это символическая ссылка на текущую ветку.
Файл `HEAD` -- это символическая ссылка на текущую ветку.
Символическая ссылка отличается от обычной тем, что она содержит не сам хеш SHA-1, а указатель на другую ссылку.

В некоторых случаях файл HEAD может содержать SHA-1 хеш какого-либо объекта.
В некоторых случаях файл `HEAD` может содержать SHA-1 хеш какого-либо объекта.
Это происходит при извлечении тега, коммита или удалённой ветки, что приводит репозиторий в состояние https://git-scm.com/docs/git-checkout#_detached_head["detached HEAD"^].

Если вы заглянете внутрь HEAD, то увидите следующее:
Если вы заглянете внутрь `HEAD`, то увидите следующее:

[source,console]
----
Expand All @@ -92,18 +92,18 @@ $ cat .git/HEAD
ref: refs/heads/test
----

При выполнении `git commit` Git создаёт коммит, указывая его родителем объект, SHA-1 которого содержится в файле, на который ссылается HEAD.
При выполнении `git commit` Git создаёт коммит, указывая его родителем объект, SHA-1 которого содержится в файле, на который ссылается `HEAD`.

При желании, можно вручную редактировать этот файл, но лучше использовать команду `symbolic-ref`.
Получить значение HEAD этой командой можно так:
При желании можно вручную редактировать этот файл, но лучше использовать команду `symbolic-ref`.
Получить значение `HEAD` этой командой можно так:

[source,console]
----
$ git symbolic-ref HEAD
refs/heads/master
----

Изменить значение HEAD можно так:
Изменить значение `HEAD` можно так:

[source,console]
----
Expand Down Expand Up @@ -205,5 +205,5 @@ ca82a6dff817ec66f44342007202690a93763949
----

Ссылки на удалённые ветки отличаются от веток (ссылок в `refs/heads`) тем, что они считаются неизменяемыми.
Это означает, что вы можете переключиться на любую из таких веток с помощью `git checkout`, но Git не установит HEAD на неё, а значит вы не сможете фиксировать свои изменения в ней с помощью `git commit`.
Это означает, что вы можете переключиться на любую из таких веток с помощью `git checkout`, но Git не установит `HEAD` на неё, а значит, вы не сможете фиксировать свои изменения в ней с помощью `git commit`.
Git воспринимает удалённые ветки как закладки на последние известные состояния веток на удалённых серверах.
Loading