.git文件夹里所有文件详解
.git文件详解
📂 文件夹部分(对应核心数据)
hooks- 存放 Git 钩子脚本(比如提交前自动检查代码、推送前跑测试)
- 默认是空模板,平时基本不用管
info- 存放 Git 的额外信息,比如排除规则(比
.gitignore更底层,一般不用)
- 存放 Git 的额外信息,比如排除规则(比
logs- 存放所有 Git 操作的日志(对应你用
git reflog查的内容) - 包含分支切换、回退、提交的完整记录,是找回误操作的关键
- 存放所有 Git 操作的日志(对应你用
objects- Git 的“核心数据库”!
- 所有文件快照、提交记录、版本历史,都以压缩对象的形式存在这里
- 你每次
git commit,Git 都会把改动打包成新对象存进来
refs- 存放所有分支、标签的引用指针
refs/heads/main:指向main分支的最新提交版本号refs/remotes/origin/main:指向远程仓库main分支的最新版本号
📄 文件部分(关键配置与状态)
config- 你最关心的远程仓库地址,就存在这里!
- 打开就能看到
[remote "origin"]配置,git remote -v命令就是读取这个文件
HEAD- 告诉你当前在哪个分支上!
- 打开文件会看到类似
ref: refs/heads/main的内容,代表你现在在main分支
index- 对应 Git 的暂存区!
- 你用
git add命令后,文件的改动就会写入这个文件,等待后续git commit - 你看到它大小是 286KB,说明你已经有不少文件被
add到暂存区了
COMMIT_EDITMSG- 保存你上一次提交的备注信息
- 当你用
git commit时,默认会加载这个文件作为提交信息模板
FETCH_HEAD/ORIG_HEADFETCH_HEAD:记录你上一次git fetch拉取的远程分支状态ORIG_HEAD:记录你上一次危险操作(比如reset、merge)前的状态,用于恢复
description- 仓库的描述信息,一般 GitWeb 等工具会用到,个人开发基本不用管
✨ 一句话帮你串起来
你平时敲的 Git 命令,本质都是在读写这些文件:
git add→ 写index文件git commit→ 写objects+ 更新refs和HEADgit push→ 把objects和refs同步到远程仓库git remote -v→ 读config文件git reflog→ 读logs文件夹
⚠️ 再次提醒:千万不要手动修改/删除这些文件!一旦损坏,你的 Git 仓库就会出问题,甚至丢失历史版本。
git checkout -b dev 会使.git文件夹发生那些变化
git checkout -b dev只改.git里少数几个“指针/日志文件”,工作区文件内容不变。
等价命令
gitbranch dev# 1. 创建分支指针gitcheckout dev# 2. 切换到新分支一、会变的文件(都在 .git/ 下)
.git/HEAD- 之前:
ref: refs/heads/main - 之后:
ref: refs/heads/dev - 作用:把“当前分支”指向 dev。
- 之前:
.git/refs/heads/dev(新增)- 内容:当前 commit 的哈希值(和 main 此刻相同)
- 作用:新建 dev 分支指针。
.git/logs/HEAD、.git/logs/refs/heads/dev- 追加一条记录:从 main 切到 dev
- 作用:
git reflog能看到这次切换。
.git/index(暂存区)- 若工作区无冲突:不变
- 若有未提交修改:会刷新为 dev 分支版本(保留你未提交的改动)。
二、完全不变的
- 工作区所有源码文件(和切分支前一模一样)
.git/objects(所有提交/文件快照,没新增、没修改).git/config(远程地址、用户名等)- 其他
hooks/、info/等
三、直观总结
- 新建分支 = 加一个指针(refs/heads/dev)
- 切换分支 = 改 HEAD 指向 + 写日志
- 代码内容本身完全不变,只是换了个“标签”继续开发。
分支操作顺序
# 1. 从 main 新建并切换到 dev 分支gitcheckout-bdev# 2. 添加所有修改gitadd.# 3. 提交修改gitcommit-m"添加实现计划2026-06-07-isolated-sign-recognition.md"# 4. 第一次推送新分支(必须用这条,最稳、不看网络脸色)gitpush-uorigin dev为什么你之前git push失败、git push -u origin dev成功?
因为:
git push依赖网络 + Git 版本 + 配置git push -u origin dev不依赖任何配置,强制推送 + 绑定远程
国内网络连 GitHub 不稳定时,永远用:
gitpush-uorigin 分支名这是100% 不会失败的推送方式。
万能流程
gitcheckout main# 切回主分支gitpull# 拉取最新gitcheckout-b新分支名# 创建新分支gitadd.gitcommit-m"提交信息"gitpush-uorigin 新分支名# 第一次必用这个