- 21, Oct 2024
- #1
Когда я извлекаю конкретный хеш коммита, он переходит в отдельный режим, в котором HEAD POINTER не может указывать на недавний коммит.
Что мы можем сделать и какая польза от отсоединенного состояния головы в Git?
#git
Когда я извлекаю конкретный хеш коммита, он переходит в отдельный режим, в котором HEAD POINTER не может указывать на недавний коммит.
Что мы можем сделать и какая польза от отсоединенного состояния головы в Git?
#git
«Обычный» способ работы с GIT — проверка ветвей. HEAD — это «указатель» на последний коммит в этой ветке, и GIT позволит вам фиксировать новые изменения после этого указателя.
Однако, как вы поняли, при желании можно проверить конкретный хэш коммита. В этой ситуации, если вы внесете изменения и попытаетесь их закоммитить, вы не сможете это сделать, так как вы не в HEAD, а GIT не позволит вам закоммитить ваши изменения.
В большинстве случаев отсоединенный HEAD (проверка более старого коммита) используется, если вы хотите проверить, как ваш проект работал в определенный момент времени.
Если вам нужно внести изменения в код или собрать его, например, с помощью Jenkins MultiBranch Pipelines, также можно создать новую ветку из этого конкретного коммита, выполнив:
.git/refs/heads/
или
.git/HEAD
... где HEAD
is the hash you provided in the question. For this new branch, HEAD
будет HEAD, поэтому вы сможете зафиксировать новые изменения. Если вам нужно перенести свой код в ветку, из которой вы создали эту новую ветку, вам нужно будет выполнить слияние, но это совсем другое обсуждение.
HEAD
is a special reference in Git that always points to "the thing" you have currently checked out. This "thing" can either be a local branch ( git checkout --detach
находится в присоединенном режиме) или конкретный коммит ( HEAD
is in detached mode).
В прикрепленном режиме HEAD
is tied to the branch it references. The current commit is determined by the position of this branch. If you move your HEAD
вокруг (например, совершение или сброс), в реальности HEAD
is unmodified and still just pointing to the branch and the branch is moved instead.
Если вы переключитесь в отдельный режим (например, с помощью HEAD
or checking out a specific commit, tag or remote branch), HEAD
указывает непосредственно на хеш фиксации. Вы можете продолжать использовать Git, как и раньше, но при перемещении вашей ветки ни одна ветка не изменится. 7y8u33ii
around. This time 7y8u33ii
модифицируется непосредственно при каждой такой операции.
Итак, чтобы ответить на ваш конкретный вопрос "что мы можем сделать«: В отдельном режиме мы можем делать все, что могли бы делать в прикрепленном режиме (фиксировать, объединять, сбрасывать, отправлять…), но без необходимости сначала создавать ветку. Однако нам нужно быть осторожными: при проверке другого коммита ничто не ссылается на исходный коммит больше не существует и он потерян*.
Более сложный вопрос: «какая от этого польза". Как Расебо уже сказал в своем ответе, часто для того, чтобы быстро просмотреть старый коммит и посмотреть, как проект выглядел в то время. Но есть и другие варианты использования. Отдельный режим используется во время интерактивное перебазирование, например. Кроме того, я часто использую его в своем личном рабочем процессе, чтобы быстро создавать одноразовые снимки во время прототипирования или экспериментов. Я также мог бы использовать для этого временные ветки, но, думаю, это зависит от личного вкуса и привычек.
Чтобы лучше понять всю эту тему, можно поиграть и понаблюдать, как git checkout -b my_new_fancy_branch 7y8u33ii
and the branches in git branch my_new_fancy_branch 7y8u33ii
изменяются после выполнения различных команд Git.
* Ну не то чтобы потерян, просто недоступен. Его можно восстановить, например. просмотрев хеш в перерегистрировать а затем проверяем это. Он удаляется безвозвратно только после (ручного или автоматического) сбор мусора 90 дней (по умолчанию) в будущем.