我试图理解 git log 命令的输出。通常,我会看到 HEAD 指向特定分支,但我对 HEAD 似乎指向本地分支和远程分支(HEAD -> 分支、起源/分支)时的含义感到困惑。
我尝试在网上寻找答案,但我什至不知道如何写问题,而且显示的结果并不相关。
git log
commit 3b64cc50d6fe262d007853774689e8ad58e0f2ae (HEAD -> internal-env-board-david-fix, origin/internal-env-board-david-fix)
Author: user <user_email>
Date: Some_Date
Added build flag to platform.ini file: -D UAVCAN_CPP_VERSION=UAVCAN_CPP11
当我运行
git log
时,如上所示,我不知道 (HEAD -> internal-env-board-david-fix, origin/internal-env-board-david-fix)
是什么意思。通常 head 只指向单个分支,而这里由于某种原因它似乎指向本地分支和远程分支。知道为什么吗?
(HEAD -> internal-env-board-david-fix, origin/internal-env-board-david-fix)
是主要由--decorate[=short|full|auto|no]
控制的输出。输出意味着“显示的任何提交的引用名称”。如果未给出,则默认使用 --decorate=short
。要隐藏输出,请使用 --no-decorate
。要过滤输出,请使用 --decorate-refs=<pattern>
和 --decorate-refs-exclude=<pattern>
。要查找所有这些参考文献,我们可以使用 git for-each-ref --points-at=<commit>
。
就您而言,
origin/internal-env-board-david-fix
与HEAD
没有直接关系。 internal-env-board-david-fix
和origin/internal-env-board-david-fix
都直接指向3b64cc50d6fe262d007853774689e8ad58e0f2ae
,而HEAD
仅指向internal-env-board-david-fix
。换句话说,HEAD
间接指向3b64cc50d6fe262d007853774689e8ad58e0f2ae
。符号->
表示间接。使用 cat .git/HEAD
,它会打印 ref: refs/heads/internal-env-board-david-fix
。
HEAD--->internal-env-board-david-fix--->3b64cc50d6fe262d007853774689e8ad58e0f2ae
origin/internal-env-board-david-fix------^
如果我们运行
git checkout 3b64cc50d6fe262d007853774689e8ad58e0f2ae
进入分离 HEAD 状态,装饰将是 (HEAD, internal-env-board-david-fix, origin/internal-env-board-david-fix)
,而符号 ->
消失了。 .git/HEAD
的内容将变为 3b64cc50d6fe262d007853774689e8ad58e0f2ae
。现在HEAD
和另外两个分支都直接指向3b64cc50d6fe262d007853774689e8ad58e0f2ae
。
HEAD--->3b64cc50d6fe262d007853774689e8ad58e0f2ae
internal-env-board-david-fix-----^ ^
origin/internal-env-board-david-fix---|
符号
表示间接。使用->
,它会打印cat .git/HEAD
。ref: refs/heads/internal-env-board-david-fix
确实如此。只是直接从
.git/HEAD
读取 HEAD 将来并不总是有效。
在 Git 2.44(2024 年第 1 季度)中,围绕伪引用处理进行了各种更改。
请参阅 commit 0a06892、commit 70c70de、commit 668cdc0、commit 8f61321(2023 年 12 月 14 日),作者:Patrick Steinhardt (
pks-t
)。gitster
-- 合并于 commit dbf668a,2024 年 1 月 2 日)
:通过wt-status
HEAD
读取ORIG_HEAD
和refdb
签字人:Patrick Steinhardt
我们直接从文件系统读取 HEAD 和
引用,以确定我们当前是否正在拆分提交。ORIG_HEAD
如果以下两条均为真:
- HEAD 指向与“rebase-merge/amend”相同的对象。
指向与“rebase-merge/orig-head”相同的对象。ORIG_HEAD
那么我们目前正在拆分提交。
当前代码只是偶然起作用,因为我们只有一个引用后端实现。
重构它以通过层读取两个引用,这样我们也将与 备用参考后端兼容。refdb
这里涉及到一些微妙之处:
- 我们传递
,这样缺少的引用将导致RESOLVE_REF_READING
返回错误。read_ref_full()
- 我们传递
,这样我们就不会尝试解析符号引用。RESOLVE_REF_NO_RECURSE
旧代码也没有解析符号引用,我们只将对象 ID 写入“”中的引用中。rebase-merge/
- 本着同样的精神,我们验证成功读取的引用不是符号引用。