Странное поведение Git при проверке HEAD (и вариантов) в Windows
Настроить
Давайте представим простой репозиторий следующим образом. Видно, что HEAD
указывает на master
$ git log --decorate --graph
* commit 99d20608088ba9c74b57e36a1b0b79ff2be42d68 (HEAD, master)
| Author: Saaman <user@domain.com>
| Date: Wed Apr 17 16:53:50 2013 +0200
|
| My third commit
|
* commit a4a040c8b5c3923a2ba0f652caae0540f84c4c98
| Author: Saaman <user@domain.com>
| Date: Wed Apr 17 16:53:27 2013 +0200
|
| My second commit
|
* commit c5d20f203c11acbb9238ab77581e27a15ccde25e
Author: Saaman <user@domain.com>
Date: Wed Apr 17 16:52:58 2013 +0200
My first commit
$ git reflog
99d2060 HEAD@{0}: commit: My third commit
a4a040c HEAD@{1}: commit: My second commit
c5d20f2 HEAD@{2}: commit (initial): My first commit
акт
Теперь давайте выполним некоторые операции проверки
$ git checkout master
Already on 'master'
$ git reflog
99d2060 HEAD@{0}: checkout: moving from master to master
99d2060 HEAD@{1}: commit: My third commit
a4a040c HEAD@{2}: commit: My second commit
c5d20f2 HEAD@{3}: commit (initial): My first commit
$ git checkout HEAD
$ git reflog
99d2060 HEAD@{0}: checkout: moving from master to master
99d2060 HEAD@{1}: commit: My third commit
a4a040c HEAD@{2}: commit: My second commit
c5d20f2 HEAD@{3}: commit (initial): My first commit
Рефлог показывает, что
- Проверяя
HEAD
не производит запись в reflog - Проверяя
master
вставляет новую запись в reflog (заявляя, чтоHEAD
переехала изmaster
вmaster
)
Давай попробуем что нибудь другое
$ git checkout head
Note: checking out 'head'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b new_branch_name
HEAD is now at 99d2060... My third commit
$ git reflog
99d2060 HEAD@{0}: checkout: moving from master to head
99d2060 HEAD@{1}: checkout: moving from master to master
99d2060 HEAD@{2}: commit: My third commit
a4a040c HEAD@{3}: commit: My second commit
c5d20f2 HEAD@{4}: commit (initial): My first commit
Рефлог теперь показывает
head
был разрешен к тому же SHA 99d2060HEAD
сейчас отсоединен- Новая запись была вставлена в reflog (заявив, что
HEAD
переехала изmaster
вhead
)
Вопросы
Мне трудно понять это поведение.
- Почему проверяют
HEAD
ничего не выдает в reflog, тогда как проверкаmaster
(ветвь, указывающая наHEAD
) делает? - Почему проверяют
head
(в нижнем регистре) отделяетHEAD
тогда как git может успешно очистить его от того же коммита?
Примечание: эти тесты были выполнены на Windows/msysgit
1 ответ
Решение
Проанализировав код, вот несколько ответов:
git checkout HEAD
ничего не регистрируется независимо от того, ГОЛОВА отсоединена или нет.- переход от "мастера" к "хозяину" на самом деле не является полезной информацией, поскольку ни ветка, ни ее цель не изменены. Немного бесполезной информации, чтобы заполнить журнал, но совершенно безвредно.
git checkout head
не работает на Linux. Он работает только в Windows, потому что файловая система нечувствительна к регистру.