設定與配置
取得與建立專案
基本快照
分支與合併
分享與更新專案
檢查與比較
修補
除錯
電子郵件
外部系統
伺服器管理
指南
管理
基礎命令
- 2.45.1 → 2.47.0 沒有變更
-
2.45.0
04/29/24
- 2.44.1 → 2.44.2 沒有變更
-
2.44.0
02/23/24
- 2.43.2 → 2.43.5 沒有變更
-
2.43.1
02/09/24
-
2.43.0
11/20/23
- 2.39.1 → 2.42.3 沒有變更
-
2.39.0
12/12/22
- 2.25.1 → 2.38.5 沒有變更
-
2.25.0
01/13/20
- 2.24.1 → 2.24.4 沒有變更
-
2.24.0
11/04/19
- 2.22.1 → 2.23.4 沒有變更
-
2.22.0
06/07/19
- 2.20.1 → 2.21.4 沒有變更
-
2.20.0
12/09/18
- 2.18.1 → 2.19.6 沒有變更
- 2.18.0 沒有變更
- 2.17.0 → 2.17.6 沒有變更
-
2.16.6
12/06/19
-
2.15.4
12/06/19
- 2.13.7 → 2.14.6 沒有變更
-
2.12.5
09/22/17
- 2.11.4 沒有變更
-
2.10.5
09/22/17
- 2.7.6 → 2.9.5 沒有變更
-
2.6.7
05/05/17
-
2.5.6
05/05/17
- 2.2.3 → 2.4.12 沒有變更
-
2.1.4
12/17/14
-
2.0.5
12/17/14
描述
Git 儲存庫有兩種不同的形式
-
一個位於工作樹根目錄的
.git
目錄; -
一個
<專案>.git
目錄,它是一個裸儲存庫(即沒有自己的工作樹),通常用於透過推送和提取與其他人交換歷史記錄。
注意:您也可以在工作樹的根目錄擁有一個純文字檔 .git
,其中包含 gitdir: <路徑>
以指向實際擁有儲存庫的目錄。此機制稱為gitfile,通常透過 git submodule
和 git worktree
命令進行管理。它通常用於子模組簽出的工作樹,以便讓您在包含的父專案中 git checkout
不包含子模組的分支。checkout
必須移除整個子模組工作樹,而不會遺失子模組儲存庫。
這些內容可能存在於 Git 儲存庫中。
- objects
-
與此儲存庫關聯的物件儲存區。通常,物件儲存區是自給自足的(即,在其中找到的物件引用的所有物件也都可以在其中找到),但有一些方法可以違反此規定。
-
您可以透過建立淺層複製來擁有一個不完整但可本地使用的儲存庫。請參閱 git-clone[1]。
-
您可以使用
objects/info/alternates
或$GIT_ALTERNATE_OBJECT_DIRECTORIES
機制從其他物件儲存區借用物件。具有此種不完整物件儲存區的儲存庫不適合發佈以用於笨拙的傳輸,但只要objects/info/alternates
指向它借用的物件儲存區,其他情況下都可以使用。如果設定了 $GIT_COMMON_DIR,則會忽略此目錄,改為使用 "$GIT_COMMON_DIR/objects"。
-
- objects/[0-9a-f][0-9a-f]
-
新建立的物件會儲存在自己的檔案中。物件會分散到 256 個子目錄中,使用 sha1 物件名稱的前兩個字元,以保持
objects
本身的目錄條目數量在可管理的範圍內。在此處找到的物件通常稱為未封裝(或鬆散)物件。 - objects/pack
-
在此目錄中找到壓縮形式儲存多個物件的封裝(檔案),以及允許隨機存取的索引檔案。
- objects/info
-
關於物件儲存區的其他資訊會記錄在此目錄中。
- objects/info/packs
-
此檔案旨在協助笨拙的傳輸發現此物件儲存區中可用的封裝。每當新增或移除封裝時,如果儲存庫發佈以用於笨拙的傳輸,則應執行
git update-server-info
以使此檔案保持最新。git repack 預設會執行此操作。 - objects/info/alternates
-
此檔案記錄此物件儲存區借用物件的替代物件儲存區的路徑,每行一個路徑名稱。請注意,不僅原生 Git 工具會在本地使用它,而且 HTTP 提取器也會嘗試在遠端使用它;如果您在 alternates 檔案中使用相對路徑(相對於物件資料庫,而不是儲存庫!),這通常會有效,但如果您使用絕對路徑,則除非檔案系統和網址中的絕對路徑相同,否則不會有效。另請參閱
objects/info/http-alternates
。 - objects/info/http-alternates
-
此檔案記錄此物件儲存區借用物件的替代物件儲存區的 URL,以在透過 HTTP 提取儲存庫時使用。
- refs
-
參考儲存在此目錄的子目錄中。git prune 命令知道要保留可從此目錄及其子目錄中找到的 refs 存取的物件。如果設定了 $GIT_COMMON_DIR,則會忽略此目錄(refs/bisect、refs/rewritten 和 refs/worktree 除外),改為使用 "$GIT_COMMON_DIR/refs"。
- refs/heads/
name
-
記錄分支
name
的樹尖端提交物件 - refs/tags/
name
-
記錄任何物件名稱(不一定是提交物件,或指向提交物件的標籤物件)。
- refs/remotes/
name
-
記錄從遠端儲存庫複製的分支的樹尖端提交物件。
- refs/replace/
<obj-sha1>
-
記錄取代
<obj-sha1>
的物件的 SHA-1。這類似於 info/grafts,並且由 git-replace[1] 在內部使用和維護。此類 refs 可以在儲存庫之間交換,而 grafts 不能。 - packed-refs
-
以更有效的方式記錄與 refs/heads/、refs/tags/ 和其他類似項目相同的資訊。請參閱 git-pack-refs[1]。如果設定了 $GIT_COMMON_DIR,則會忽略此檔案,改為使用 "$GIT_COMMON_DIR/packed-refs"。
- HEAD
-
一個指向
refs/heads/
命名空間的符號參考(請參閱詞彙表),描述目前活動的分支。如果儲存庫未與任何工作樹關聯(即裸儲存庫),則它沒有太大意義,但是有效的 Git 儲存庫必須具有 HEAD 檔案;某些瓷器可能使用它來猜測儲存庫的指定「預設」分支(通常是master)。如果指定的名稱為 name 的分支(尚未)存在,這是合法的。在某些舊版設定中,它是一個符號連結,而不是指向目前分支的符號參考。HEAD 也可以直接記錄特定的提交,而不是作為指向目前分支的符號參考。這種狀態通常稱為分離的 HEAD。有關詳細資訊,請參閱 git-checkout[1]。
- config
-
儲存庫特定組態檔案。如果設定了 $GIT_COMMON_DIR,則會忽略此檔案,改為使用 "$GIT_COMMON_DIR/config"。
- config.worktree
-
多個工作目錄設定中主要工作目錄的特定組態檔案(請參閱 git-worktree[1])。
- branches
-
一種稍微過時的方式來儲存用於指定 git fetch、git pull 和 git push 的 URL 的縮寫。可以將檔案儲存為
branches/<name>
,然後可以將 name 提供給這些命令,以取代 repository 引數。有關詳細資訊,請參閱 git-fetch[1] 中的 REMOTES 部分。此機制已過時,在現代儲存庫中不太可能找到。如果設定了 $GIT_COMMON_DIR,則會忽略此目錄,改為使用 "$GIT_COMMON_DIR/branches"。 - hooks
-
Hook 是由各種 Git 指令使用的自訂腳本。當執行 git init 時,會安裝一些範例 hook,但預設情況下全部都會停用。要啟用,必須重新命名檔案,移除
.sample
後綴。請閱讀 githooks[5] 以了解每個 hook 的更多詳細資訊。如果設定了 $GIT_COMMON_DIR,則會忽略此目錄,並改用 "$GIT_COMMON_DIR/hooks"。 - common
-
當使用多個工作樹時,$GIT_DIR 中的大多數檔案都是每個工作樹獨有的,只有少數已知的例外。然而,common 底下的所有檔案將會在所有工作樹之間共享。
- index
-
儲存庫目前的索引檔案。通常在裸儲存庫中找不到。
-
共享索引部分,供 $GIT_DIR/index 和其他臨時索引檔案參考。僅在分割索引模式下有效。
- info
-
有關儲存庫的其他資訊會記錄在此目錄中。如果設定了 $GIT_COMMON_DIR,則會忽略此目錄,並改用 "$GIT_COMMON_DIR/info"。
- info/refs
-
此檔案可協助「dumb transports」發現此儲存庫中可用的 ref。如果儲存庫是發布給「dumb transports」的,則每次建立或修改標籤或分支時,都應該由 git update-server-info 重新產生此檔案。這通常是從
hooks/update
hook 完成的,當您使用 git push 推送至儲存庫時,該 hook 會由 git-receive-pack 指令執行。 - info/grafts
-
此檔案會記錄偽造的 commit 祖先資訊,以模擬 commit 的父系集合與實際建立 commit 的方式不同。每行記錄描述一個 commit 及其偽造的父系,列出以空格分隔並以換行符號終止的 40 位元組十六進位物件名稱。
請注意,grafts 機制已過時,並且可能會導致在儲存庫之間傳輸物件時發生問題;請參閱 git-replace[1],它提供了更彈性且強大的系統來執行相同的操作。
- info/exclude
-
此檔案,按照 Porcelains 的慣例,會儲存排除模式清單。
.gitignore
是每個目錄的忽略檔案。git status、git add、git rm 和 git clean 會查看它,但核心 Git 指令不會查看它。另請參閱:gitignore[5]。 - info/attributes
-
定義要指派給路徑的屬性,類似於每個目錄的
.gitattributes
檔案。另請參閱:gitattributes[5]。 - info/sparse-checkout
-
此檔案儲存稀疏檢出的模式。另請參閱:git-read-tree[1]。
- remotes
-
儲存 URL 的簡寫和預設的 refname,以便在使用 git fetch、git pull 和 git push 指令與遠端儲存庫互動時使用。有關詳細資訊,請參閱 git-fetch[1] 中的 REMOTES 章節。此機制已過時,不太可能在現代儲存庫中找到。如果設定了 $GIT_COMMON_DIR,則會忽略此目錄,並改用 "$GIT_COMMON_DIR/remotes"。
- logs
-
對 ref 所做變更的記錄會儲存在此目錄中。有關詳細資訊,請參閱 git-update-ref[1]。如果設定了 $GIT_COMMON_DIR,則會忽略此目錄(logs/HEAD 除外),並改用 "$GIT_COMMON_DIR/logs"。
- logs/refs/heads/
name
-
記錄對名為
name
的分支頂端所做的所有變更。 - logs/refs/tags/
name
-
記錄對名為
name
的標籤所做的所有變更。 - shallow
-
這與
info/grafts
類似,但由淺層複製機制在內部使用和維護。請參閱 git-clone[1] 和 git-fetch[1] 的--depth
選項。如果設定了 $GIT_COMMON_DIR,則會忽略此檔案,並改用 "$GIT_COMMON_DIR/shallow"。 - commondir
-
如果此檔案存在,則 $GIT_COMMON_DIR(請參閱 git[1])會設定為此檔案中指定的路徑,如果未明確設定。如果指定的路徑是相對路徑,則相對於 $GIT_DIR。具有 commondir 的儲存庫,如果沒有 "commondir" 所指向的儲存庫,則是不完整的。
- modules
-
包含子模組的 git 儲存庫。
- worktrees
-
包含連結工作樹的管理資料。每個子目錄都包含連結工作樹的與工作樹相關的部分。如果設定了 $GIT_COMMON_DIR,則會忽略此目錄,並改用 "$GIT_COMMON_DIR/worktrees"。
- worktrees/<id>/gitdir
-
一個文字檔案,其中包含指向此處的 .git 檔案的絕對路徑。這用於檢查連結的儲存庫是否已手動移除,並且不再需要保留此目錄。每次存取連結的儲存庫時,都應更新此檔案的 mtime。
- worktrees/<id>/locked
-
如果此檔案存在,則連結的工作樹可能位於可攜式裝置上且不可用。此檔案的存在會阻止
worktrees/<id>
被自動或由git worktree prune
手動修剪。該檔案可能包含一個字串,說明儲存庫為何被鎖定。 - worktrees/<id>/config.worktree
-
工作目錄特定的組態檔案。
Git 儲存庫格式版本
每個 git 儲存庫都會在其 config
檔案的 core.repositoryformatversion
鍵中標記一個數值版本。此版本指定了在磁碟儲存庫資料上操作的規則。不理解磁碟儲存庫宣告的特定版本的 git 實作「不得」在該儲存庫上操作;這樣做不僅有產生錯誤結果的風險,而且實際上會遺失資料。
由於此規則,版本更新應保持在絕對最小值。相反,我們通常偏好以下策略
-
更新個別資料檔案 (例如,索引、packfile 等) 的格式版本號碼。這會將不相容性限制在這些檔案中。
-
引入當由舊用戶端使用時會優雅降級的新資料 (例如,pack bitmap 檔案會被舊用戶端忽略,而舊用戶端只是不利用它們提供的最佳化)。
整個儲存庫的格式版本更新,應該只是無法獨立版本化的變更的一部分。例如,如果要變更物件的可到達性規則或鎖定 ref 的規則,則需要更新儲存庫格式版本。
請注意,這僅適用於直接存取儲存庫的磁碟內容。僅理解格式 0
的舊用戶端仍然可以透過 git://
連線至使用格式 1
的儲存庫,只要伺服器進程理解格式 1
。
推出版本更新 (無論是整個儲存庫還是單一檔案) 的首選策略是教導 git 讀取新格式,並允許使用組態開關或命令列選項寫入新格式 (用於實驗或那些不在意與舊版 git 向後相容的人)。然後,在經過一段長時間以允許讀取功能變得普及之後,我們可能會預設切換為寫入新格式。
目前定義的格式版本是
版本 1
此格式與版本 0
相同,但有以下例外
-
當讀取
core.repositoryformatversion
變數時,支援版本 1 的 git 實作「也必須」讀取組態檔案extensions
區段中找到的任何組態鍵。 -
如果版本 1 儲存庫指定執行中 git 尚未實作的任何
extensions.*
鍵,則操作「不得」繼續。同樣地,如果實作不理解任何已知鍵的值,則操作「不得」繼續。
請注意,如果組態檔案中未指定任何擴充功能,則 core.repositoryformatversion
「應該」設定為 0
(將其設定為 1
沒有任何好處,並且會使儲存庫與舊版 git 的實作不相容)。
本文件將作為擴充功能的主要清單。任何希望定義新擴充功能的實作都應該在此處記錄下來,以便宣告該名稱。
定義的擴充功能是
preciousObjects
當組態鍵 extensions.preciousObjects
設定為 true
時,儲存庫中的物件「不得」刪除 (例如,由 git-prune
或 git repack -d
刪除)。
partialClone
當設定組態鍵 extensions.partialClone
時,表示儲存庫是使用部分複製 (或稍後執行部分擷取) 建立的,並且遠端可能省略傳送某些不需要的物件。此類遠端稱為「promisor remote」,它保證所有此類省略的物件都可以在未來從它擷取。
此鍵的值是 promisor 遠端的名稱。
GIT
屬於 git[1] 套件的一部分