Git - HEAD



HEAD 是 Git 中对正在处理的分支上最近一次提交的引用。

可以将其视为指向活动分支顶端的标记或指针。

HEAD 本质上跟踪正在处理的提交,并在切换分支或检查各种提交时进行调整。

  • 当使用 checkout 命令切换分支时,HEAD 会更新为指向新分支的顶端。

  • 因此,HEAD 成为一个动态引用,有助于监控仓库的当前工作上下文。

  • 作为当前分支上最近的提交,HEAD 对于理解和导航 Git 仓库的状态至关重要。

Git 中的 HEAD

指向当前提交的指针

在 Git 中,HEAD 主要用作指向当前正在处理的分支上最近一次提交的指针。

  • 因此,Git 能够监控项目的当前状态并确定哪些更改已准备好进行即将到来的提交。

  • 它确保所有工作都源自分支中的最新点。

分离的 HEAD

在检查远程分支、标签或旧提交时,HEAD 可能会分离

  • 在这种情况下,HEAD 直接指向特定提交,而不是引用分支。

  • 除非从分离的 HEAD 创建一个新分支,否则在此状态下进行的任何新提交都不会与任何分支关联,并且如果切换回分支,这些提交将丢失。

移动 HEAD

一些 Git 函数(如 git checkoutgit switchgit reset)会动态更改 HEAD

  • 这些命令通过更改当前分支或回滚更改导致 HEAD 重定向到正确的提交。

  • 例如,git reset 可以通过将 HEAD 移至先前的提交来回滚更改,git switch 允许切换分支,而 git checkout 更改工作分支。

理解 refsHEAD 的概念对于理解 Git 中分支和提交的管理至关重要。

Git Refs

Refs 是指向特定提交的指针。这些文件保存在 .git/refs 目录中,并组织到标签和头部等子目录中。

Heads: 此子目录包含对每个分支的最新提交的引用。

例如,以分支名称命名的文件(例如,master 或 main)保存该分支上最新提交的提交 ID。

Tags: 此子目录包含与标签关联的特定提交的引用。

HEAD

唯一的引用 HEAD 指向我们当前正在处理的分支,因此也指向对该分支所做的最新提交。

  • 当前签出的分支可以在 .git/HEAD 文件中看到。

  • 例如,如果我们在 master 分支上,则 .git/HEAD 文件将指向 refs/heads/master。

  • 当我们切换分支时,HEAD 会更新为引用新分支的最新提交。

  • 这使得 Git 可以根据我们所在的 branch 来管理我们工作目录的状态。

可以使用 git show HEAD 命令查看 HEAD 引用的当前状态。

  • 它显示了 HEAD 指向的提交并提供有关它的信息,包括提交消息、作者、日期和所做的更改。

  • 此命令还显示了 HEAD 相对于当前分支上最新提交的位置。

$ git show HEAD

Git 分离的 HEAD

当直接签出特定提交而不是分支时,就会发生分离的 HEAD 状态。

HEAD 不指向分支引用,而是直接指向指定的提交。

使用以下命令进入此状态

git checkout <commit ID>

在分离的 HEAD 状态下,除非从此处创建新分支,否则新提交不会与任何分支关联。

此状态可用于检查或处理特定提交处的仓库,而不会影响分支结构。

要从较旧的提交中恢复对特定文件的更改,请使用

    
git checkout <commit ID> <file>

在复杂的 Git 工作流程中,经常使用几个与 HEAD 相关的特定引用。

  • ORIG_HEAD: 监视在诸如 git reset 等重要操作之前执行的 HEAD

    如果出现问题,它有助于返回到初始配置。

  • MERGE_HEAD: 指示在合并操作期间,将哪些提交合并到当前分支中。

    Git 使用它来监视和控制合并过程。

  • FETCH_HEAD: 指示从远程仓库中检索到的最新提交。

    它指示最新提取操作的顶端位置。

使用 Git 命令与 HEAD

使用 HEAD 重置:命令 git reset HEAD~1 通过将 HEAD 回滚到先前的提交来撤消最近的提交。

简单来说,这会撤消最近的提交。

引用以前的提交

  • HEAD~1 指的是当前提交之前的提交。

  • HEAD~2 指的是当前提交之前的两个提交。

这样,HEAD 可以轻松地导航和引用历史记录中的先前提交。

在这种情况下,我们需要查看四个提交之前的项目版本,并可能从此处开始一个新分支。

查看提交日志

首先,检查提交历史以识别 HEAD 当前指向的位置并找到感兴趣的提交

git log --oneline

b2c3d4e (HEAD -> main) Implement user authentication
a4b5c6d Improve error handling
c7d8e9f Refactor database schema
d0e1f2g Update dependencies
e3f4g5h Initial commit

这里,HEAD 指向提交 b2c3d4e,消息为 Implement user authentication

签出较旧的提交

要检查四个提交之前的项目状态,请使用以下命令

git checkout HEAD~4

Note: switching to 'e3f4g5h'.

You are in 'detached HEAD' state. You can explore this state, make experimental changes, and create commits without affecting branches. 
Switch back to a branch when done to avoid losing work.

此消息表明 HEAD 现在指向提交 e3f4g5h,并且仓库处于分离的 HEAD 状态。

创建新分支

如果此较旧的提交是新工作的良好起点,请从此分离的 HEAD 状态创建新分支

git checkout -b feature-old-state

Switched to a new branch 'feature-old-state'

HEAD 现在指向从提交 e3f4g5h 开始的新分支 feature-old-state

进行更改并提交

进行任何必要的更改,然后添加并提交它们

git add .
git commit -m "Begin new feature development based on earlier commit"

[feature-old-state f3g4h5i] Begin new feature development based on earlier commit
1 file changed, 2 insertions(+)

HEAD 已移至 feature-old-state 分支上的新提交 f3g4h5i。

验证当前 HEAD

要确认新提交后 HEAD 指向的位置,请使用

git show-ref HEAD

f3g4h5i1a2b3c4d5e6f7g8h9i0jklmnopqrstu refs/heads/feature-old-state
广告