git HEAD 分离 *from* 与分离 *at*
git HEAD detached *from* vs detached *at*
我 不是 git 的新手。我知道分离的 HEAD 是什么,我可以检查一个新的分支以继续前进。但是今天我看到了 detached from
消息而不是 detached at
消息。在尝试中止包含 2 个子模块的回购中的合并时,我的一个子模块卡在了这种状态:
so_is_my_nacho_cheese$ git status
HEAD detached from 9733eeb0
nothing to commit, working tree clean
问题 1:
from 部分让我失望。看惯了at
。这个提交指的是什么?这是 HEAD 在被转移到无分支提交之前的最后一个地方吗?在我的例子中,那个提交在子模块 reflog 中,但它在 HEAD@{7}
处向下 7 层。这看起来不像是 HEAD 所在的最后一个地方。但是因为这是父模块中中止合并的结果,所以可能因此无法跟踪 HEAD 的移动。这个 detached from
提交通常指的是什么?
问题 2:
让我更加困惑的是,根据 git 日志,我的 HEAD 是 指向子模块中的一个分支:
so_is_my_nacho_cheese$ git log --graph --oneline -n 5
* ba737d3b (HEAD, xdhmoore_pascal) Just to record pascal run
* 5b69ce96 Fix fine_tune_checkpoint_loading
* 21dc78b2 Just docker changes applied to base
* 9733eeb0 (xdhmoore_base) Updating center_net_mobilenet_v2_fpn_feature_extractor to support classification finetuning.
* 63ec7359 Adding float feature to dataset_util
为什么 git status
告诉我我的 HEAD 是分离的(从 9733eeb0
,虽然不是 在 什么commit) 而 git log
说它指向 ba737d3b
?
当分离的 HEAD
指向首次检出的提交时,git status
表示 detached at <the_base_commit>
。如果然后您进行新提交或使用 git reset
将 HEAD
移动到另一个提交,例如其父提交,git status
表示 detached from <the_base_commit>
。如果然后您将 HEAD
重置为基本提交,git status
会再次显示 detached at <the_base_commit>
。
基本提交记录在 HEAD
的引用日志中,在 .git/logs/HEAD
中。如果您删除 .git/logs/HEAD
,git status
会显示 Not currently on any branch
,因为它现在找不到基础提交。
我理解中遗漏的一个关键项目是,您仍然可以在指向带有分支的提交时拥有分离的 HEAD。如果您没有分离,日志将显示 HEAD ->
并带有箭头:
分离:
so_is_my_nacho_cheese$ git log -n 1 --oneline --graph
* ba737d3b (HEAD, xdhmoore_pascal) Just to record pascal run
未分离:
so_is_my_nacho_cheese$ git log -n 1 --oneline --graph
* ba737d3b (HEAD -> xdhmoore_pascal) Just to record pascal run
我 不是 git 的新手。我知道分离的 HEAD 是什么,我可以检查一个新的分支以继续前进。但是今天我看到了 detached from
消息而不是 detached at
消息。在尝试中止包含 2 个子模块的回购中的合并时,我的一个子模块卡在了这种状态:
so_is_my_nacho_cheese$ git status
HEAD detached from 9733eeb0
nothing to commit, working tree clean
问题 1:
from 部分让我失望。看惯了at
。这个提交指的是什么?这是 HEAD 在被转移到无分支提交之前的最后一个地方吗?在我的例子中,那个提交在子模块 reflog 中,但它在 HEAD@{7}
处向下 7 层。这看起来不像是 HEAD 所在的最后一个地方。但是因为这是父模块中中止合并的结果,所以可能因此无法跟踪 HEAD 的移动。这个 detached from
提交通常指的是什么?
问题 2:
让我更加困惑的是,根据 git 日志,我的 HEAD 是 指向子模块中的一个分支:
so_is_my_nacho_cheese$ git log --graph --oneline -n 5
* ba737d3b (HEAD, xdhmoore_pascal) Just to record pascal run
* 5b69ce96 Fix fine_tune_checkpoint_loading
* 21dc78b2 Just docker changes applied to base
* 9733eeb0 (xdhmoore_base) Updating center_net_mobilenet_v2_fpn_feature_extractor to support classification finetuning.
* 63ec7359 Adding float feature to dataset_util
为什么 git status
告诉我我的 HEAD 是分离的(从 9733eeb0
,虽然不是 在 什么commit) 而 git log
说它指向 ba737d3b
?
当分离的 HEAD
指向首次检出的提交时,git status
表示 detached at <the_base_commit>
。如果然后您进行新提交或使用 git reset
将 HEAD
移动到另一个提交,例如其父提交,git status
表示 detached from <the_base_commit>
。如果然后您将 HEAD
重置为基本提交,git status
会再次显示 detached at <the_base_commit>
。
基本提交记录在 HEAD
的引用日志中,在 .git/logs/HEAD
中。如果您删除 .git/logs/HEAD
,git status
会显示 Not currently on any branch
,因为它现在找不到基础提交。
我理解中遗漏的一个关键项目是,您仍然可以在指向带有分支的提交时拥有分离的 HEAD。如果您没有分离,日志将显示 HEAD ->
并带有箭头:
分离:
so_is_my_nacho_cheese$ git log -n 1 --oneline --graph
* ba737d3b (HEAD, xdhmoore_pascal) Just to record pascal run
未分离:
so_is_my_nacho_cheese$ git log -n 1 --oneline --graph
* ba737d3b (HEAD -> xdhmoore_pascal) Just to record pascal run