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
廣告