设置
让我们想象一个简单的存储库,如下所示。可以看出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
Act
现在,让我们执行一些结账操作
$ 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
reflog显示
- 签出
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
reflog现在显示
head
已解析为同一SHA 99d2060HEAD
现已分离- 在reflog中插入了一个新条目(说明
HEAD
已从master
移动到head
(
问题
我很难理解这些行为。
- 为什么检出
HEAD
不会在reflog中产生任何东西,而检出master
(由HEAD
指向的分支(会产生 - 为什么签出
head
(小写(会分离HEAD
,而git可以成功地将其剥离到同一提交
注意:这些测试是在Windows/msysgit 上执行的
分析代码后,以下是一些答案:
- 无论HEAD是否分离,
git checkout HEAD
都不会记录任何内容 - 从"master"移动到"master"并不是一个真正有用的信息,因为分支及其目标都没有改变。日志中有一些无用的信息,但相当无害
git checkout head
在Linux上不起作用。它只适用于Windows,因为文件系统不区分大小写