git 提交日志中的“HEAD ->branch, origin/branch”是什么意思?

问题描述 投票:0回答:3

我试图理解 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 只指向单个分支,而这里由于某种原因它似乎指向本地分支和远程分支。知道为什么吗?

git command-line
3个回答
5
投票

Pro Git 书 说:

Git 如何知道你当前所在的分支?它保留一个名为 HEAD 的特殊指针...在 Git 中,这是一个指向您当前所在的本地分支的指针。在这种情况下,你仍然是 master。

HEAD 指向特定分支,但

git log
命令还向您显示远程分支相对于本地分支的位置。在这种情况下,两个分支在同一个提交中对齐。情况并非总是如此。所有这些都在第 3 章中用图表进行了很好的描述。


1
投票

(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---|

0
投票

来自ElpieKay答案

符号

->
表示间接。使用
cat .git/HEAD
,它会打印
ref: refs/heads/internal-env-board-david-fix

确实如此。只是直接从

.git/HEAD
读取 HEAD 将来并不总是有效。

在 Git 2.44(2024 年第 1 季度)中,围绕伪引用处理进行了各种更改。

请参阅 commit 0a06892commit 70c70decommit 668cdc0commit 8f61321(2023 年 12 月 14 日),作者:Patrick Steinhardt (

pks-t
)
(由 Junio C Hamano --
gitster
--
合并于 commit dbf668a,2024 年 1 月 2 日)

wt-status
:通过
HEAD
 读取 
ORIG_HEAD
refdb

签字人:Patrick Steinhardt

我们直接从文件系统读取 HEAD 和

ORIG_HEAD
引用,以确定我们当前是否正在拆分提交。
如果以下两条均为真:

  • HEAD 指向与“rebase-merge/amend”相同的对象。
  • ORIG_HEAD
    指向与“rebase-merge/orig-head”相同的对象。

那么我们目前正在拆分提交。

当前代码只是偶然起作用,因为我们只有一个引用后端实现。
重构它以通过

refdb
层读取两个引用,这样我们也将与 备用参考后端兼容。

这里涉及到一些微妙之处:

  • 我们传递
    RESOLVE_REF_READING
    ,这样缺少的引用将导致
    read_ref_full()
    返回错误。
  • 我们传递
    RESOLVE_REF_NO_RECURSE
    ,这样我们就不会尝试解析符号引用。
    旧代码也没有解析符号引用,我们只将对象 ID 写入“
    rebase-merge/
    ”中的引用中。
  • 本着同样的精神,我们验证成功读取的引用不是符号引用。
© www.soinside.com 2019 - 2024. All rights reserved.