文件夾介紹
🍎 在 macOS 上如何查看 .git 文件夾?
? 方法一:終端查看(最推薦)
cd /你的項目路徑/
ls -a
-a 參數表示“顯示所有文件(包括隱藏的)”,你就能看到:
.git
.gitignore
README.md
...
? 方法二:在 Finder 中顯示隱藏文件
? Command + Shift + .(句號)
? 方法三:用 VS Code 直接看
1. 打開設置:? + ,
2. 搜索:files.exclude
3. 把其中的 .git 相關條目注釋掉或者取消選中(VS Code 會把某些目錄默認隱藏)
📦 .git 目錄里有什么?
文件/目錄 | 作用 |
---|---|
HEAD | 當前指向的分支 |
config | Git 倉庫的本地配置 |
refs/ | 各種分支、標簽引用 |
objects/ | 所有提交、文件內容、樹結構的哈希存儲(Git 的“數據庫”) |
hooks/ | 提交前/后可以觸發的腳本 |
logs/ | 操作日志(比如 reflog) |
沒錯,.git/objects/ 里那些奇奇怪怪的哈希文件,其實就是 Git 真正存儲所有數據的地方,它們不是普通的“文件”,而是 Git 自己的 壓縮 + 哈希命名的對象數據庫。
📁 .git/objects/ 目錄結構長這樣:
.git/objects/
├── 1a/
│ └── 2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9
├── 2f/
│ └── e4d3a6...
├── info/
├── pack/
這些文件夾名(如 1a)和文件名(如 2b3c…)拼起來就是一個完整的 Git 對象的哈希 ID(SHA-1 / SHA-256):
1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9
Git 有 4 種核心對象類型:
類型 | 說明 |
---|---|
blob | 文件的實際內容 |
tree | 目錄結構,記錄了哪些文件/子目錄 |
commit | 一次提交(指向一個 tree 和父提交) |
tag | 標簽對象(可選) |
? 它們不是普通文本文件,是 zlib 壓縮過的二進制格式。
? 你如果直接 cat 它們,會看到亂碼。
? 要查看內容,得用 Git 自己的工具來“解碼”。
git cat-file -t <對象哈希> # 查看類型
git cat-file -p <對象哈希> # 查看內容
git cat-file -t 1a2b3c... # 會返回 commit
git cat-file -p 1a2b3c... # 會顯示提交信息、tree、parent 等
? 為什么 git cat-file -p 沒有我改的代碼內容?
你查看的是一個 commit 對象,它只是一個元信息結構,不直接包含代碼內容,而是指向一個 tree 對象,那個 tree 才是“這次提交的文件結構”。
~git cat-file -p 2128b10ad973b63050220008f4f829ca7cf1c91d
tree be01ffd3ae95fa8ddcea01d1c192763dbcb09067
parent 68e3ee2223934ac2286090a0af7dffc31a7a14f8
author jacinli <jackleo120ch@gmail.com> 1742742852 +0800
committer jacinli <jackleo120ch@gmail.com> 1742742852 +0800Add async and threading examples, along with a tool factory implementation for weather and time functions. Enhance AsyncOpenAIOut to support tool calls and integrate with the new factory structure.
(ai_tools_show) ? ai_tools_show git:(main)
先使用commit的hash 進行查看,找到了這個tree 的東西
然后:
🧩 第一步:查看 tree 的結構
git cat-file -p be01ffd3ae95fa8ddcea01d1c192763dbcb09067
100644 blob 4d0b7ff0d8ff5a79dc93760360bc6d2f08a5b16f .env.example
100644 blob 467ecf380409fdafed743e40ec61b1d2ce995f4c .gitignore
100644 blob e4fba2183587225f216eeada4c78dfab6b2e65f5 .python-version
100644 blob 261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64 LICENSE
100644 blob 5f55fdc35d072fc8541908b3ddea28cbd363dcd3 README.md
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 main.py
040000 tree 14c520d1ba7e2871f6a85a83c28f790043eaaf02 opensource
100644 blob 8dcd957ad7bc913282d710d1387fe45c9879aeeb pyproject.toml
040000 tree 852d4ade89a36f56b3140fc7a7d3308222b425ae python_base
100644 blob b38a7182879346d08727dc60c243774cade67314 requirements.txt
040000 tree c3217f601f44899455e6933b807970160d550ebd routers
040000 tree 1c56dc17f0e051a7253e67be29106d81e6d4aa4b services
100644 blob 5069490541ffdc73cc5605f0f96822dfafce0273 uv.lock
再次查看:
git cat-file -p b38a7182879346d08727dc60c243774cade67314
openai
python_dotenv
fastapi
uvicorn
itsdangerous
sqladmin
sqlalchemy
langfuse%
(ai_tools_show) ? ai_tools_show git:(main)
輸出的就是你 main.py 的真實內容!?
🧩 如果遇到 tree(目錄),繼續查
你想快速查看這次提交的改動文件內容,其實可以直接:
git show 2128b10ad973b63050220008f4f829ca7cf1c91d
這會自動幫你:
? 展示提交信息 ?
? 展示 diff ?
? 展示改了哪些文件 ?
? 展示文件內容改了哪幾行 ?
切換分支
Git 切換分支本質上就是更新 .git/HEAD 和 .git/refs/ 的指向!
🧠 問題核心:
? 我每次 git checkout 或 git switch 切換分支,Git 到底做了啥?
? 一句話回答:
Git 本質上只是修改了 .git/HEAD 文件的內容,讓它指向你要切換的分支(分支指向的是某個 commit 對象),然后把那個提交的快照內容 checkout 到工作區。
1. .git/HEAD 是當前分支的“指針”
cat .git/HEADref: refs/heads/main
說明 HEAD 當前指向的是 main 分支。
2. .git/refs/heads/main 存的是這個分支的 最新 commit 哈希
cat .git/refs/heads/main2128b10ad973b63050220008f4f829ca7cf1c91d
這就是 main 分支的“最新提交 ID”。
HEAD → refs/heads/main → commit 哈希 → tree → blob → 文件快照
3. 當你執行 git switch feature-x 時,發生了這些變化:
? .git/HEAD 從指向 main 改為指向 refs/heads/feature-x
? Git 讀取 feature-x 分支對應的 commit
? 提取它指向的 tree 和 blob
? 替換你工作目錄中的文件,使其反映這個 commit 的快照內容
命令 | 用途 | 特點 |
---|---|---|
git switch | 專注于“切換分支” | 更安全、更清晰,推薦使用 |
git checkout | “萬能命令”:切分支、切文件、切提交都能干 | 功能強,但容易誤操作(如誤切文件) |
特性 | git switch | git checkout |
---|---|---|
語義 | 只用于“切換分支” | 又能切分支又能切文件又能切提交 |
推薦 | ? Git 官方推薦 | ?? 功能強但容易誤用 |
是否 stash | ? 默認不會自動 stash | ? 一樣不會 |
是否檢查沖突 | ? 是的 | ? 也是 |
交互提示 | ? 更人性化(會提示 use --discard-changes) | ? 更容易誤刪 |
日常開發中,推薦你使用:
git switch <branch> # 切已有分支
git switch -c <branch> # 創建并切換分支
git checkout -- main.py # 回滾某個文件
git checkout 123abc # 暫時進入某個提交(detached HEAD)