当前位置: 首页 > news >正文

.git 文件夹

文件夹介绍

🍎 在 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当前指向的分支
configGit 仓库的本地配置
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 +0800

Add 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/HEAD

ref: refs/heads/main

说明 HEAD 当前指向的是 main 分支。

2. .git/refs/heads/main 存的是这个分支的 最新 commit 哈希

cat .git/refs/heads/main

2128b10ad973b63050220008f4f829ca7cf1c91d

这就是 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 switchgit checkout
语义只用于“切换分支”又能切分支又能切文件又能切提交
推荐✅ Git 官方推荐⚠️ 功能强但容易误用
是否 stash❌ 默认不会自动 stash❌ 一样不会
是否检查冲突✅ 是的✅ 也是
交互提示✅ 更人性化(会提示 use --discard-changes)❌ 更容易误删

日常开发中,推荐你使用:

git switch <branch>        # 切已有分支
git switch -c <branch>     # 创建并切换分支
git checkout -- main.py     # 回滚某个文件
git checkout 123abc         # 暂时进入某个提交(detached HEAD)

相关文章:

  • ctfshow WEB web7
  • redis配置文件解析
  • oracle密码过期 ORA-28001解决方案: the password has expired
  • Linux学习笔记(应用篇三)
  • Java 大视界 -- 基于 Java 的大数据分布式系统的监控与运维实践(155)
  • RustDesk部署到linux(自建服务器)
  • Win11+VS2022+CGAL5.6配置
  • 自然语言处理NLP-文本预处理
  • nodejs-原型污染链
  • 4.Matplotlib:基础绘图
  • QT自运行程序
  • 在 VMware Workstation 17 中安装的 Ubuntu 虚拟机无法使用桥接模式
  • 【FDTD Solutions仿真入门及应用】
  • 【高项】信息系统项目管理师(十二)项目干系人管理【3分】
  • 《云原生安全攻防》-- K8s容器安全:权限最小化与SecurityContext
  • 洪水灌溉算法 + 总结
  • shelljs:理解ShellJS / 安装引入 / 常见方法 / 优势 / 应用场景
  • JVM 为什么不使用引用计数算法?——深入解析 GC 策略
  • 无人机无刷电机工作原理与技术要点
  • C语言中的指针高级运用
  • 125%→10%、24%税率暂停90天,对美关税开始调整
  • AI含量非常高,2025上海教育博览会将于本周五开幕
  • 大英博物馆展歌川广重:他是梵高最钟爱的浮世绘名家
  • 通化市委书记孙简升任吉林省副省长
  • 马上评丨火车穿村而过多人被撞身亡,亡羊补牢慢不得
  • 广东韶关一镇干部冲进交通事故火海救人,获授“见义勇为”奖励万元