深入理解Git(二)——Git Repo
一、Git简述1.1 Git的特点快照存储(Snapshots): Git与其他版本控制系统的核心区别在于存储方式。Git存储的是文件系统的快照而非文件差异(delta)。当文件未改变时Git仅存储指向之前相同文件的链接。本地操作(Local): 大多数Git操作只需本地文件和资源即可完成无需网络连接。这使得操作速度极快且支持离线工作。git commit仅提交到本地仓库git push推送到服务器仓库数据完整性(Integrity): 所有Git对象都通过SHA-1哈希校验40位十六进制字符串确保内容不可篡改。仅添加数据(Add-only): Git操作主要向数据库添加数据极少删除。即使删除操作也会生成新快照历史数据可通过特定方式恢复。1.2 Git的三种对象Blob对象: 存储文件内容本身每个文件内容生成唯一SHA-1哈希值。例如README、LICENSE、test.rb三个文件会生成三个独立的blob。Tree对象: 表示目录结构包含文件名与对应blob的哈希值映射关系。如一个tree可能记录README→5b1d3、LICENSE→911e7、test.rb→cbab0。Commit对象: 包含树对象哈希值、父提交哈希值(首提交除外)、作者信息和提交信息。1.3 Git的三种状态1仓库(Repository)存储内容: 包含所有commit历史记录、分支指针等元数据存储在.git目录中。通过git commit将暂存区内容永久保存至此。2暂存区/索引区(Staging Area)过渡作用: 使用git add将工作区修改添加至此区域准备下次提交。允许选择性提交部分修改。3工作区(Working Directory)编辑空间: 项目文件的当前状态直接可见和修改。通过git checkout可将仓库内容恢复到工作区。4分支(Branch)轻量指针: 分支本质是指向某个commit的可移动指针。如master分支指向最新commit时新commit会使指针自动前移。HEAD指针: 特殊指针指向当前所在的分支。切换分支时HEAD会更新指向如git checkout -b feature会使HEAD指向新创建的feature分支。分支差异: 不同分支通过指向不同commit产生差异。feature分支比master多一个commit时两个分支的历史路径就会分叉。二、Git命令2.1 底层命令定义: 称为plumbing(管道)命令是Git的底层核心操作命令特点:直接操作Git对象和元数据输出简洁或复杂适合脚本和高级用户使用需要多个命令组合才能完成高层命令的功能示例命令:git hash-object: 计算对象哈希值git update-index: 更新索引git write-tree: 写入树对象git commit-tree: 创建提交对象2.2 高层命令定义: 称为porcelain(陶瓷)命令是面向用户的友好命令特点:封装底层操作简化用户操作输出格式友好适合日常使用一个命令可完成完整功能示例命令:git add: 工作区→暂存区git commit: 暂存区→仓库git status: 查看状态git log: 查看提交历史三、从零实现git仓库3.1 创建.git目录步骤:创建.git目录: mkdir .git创建objects目录: mkdir .git/objects (存储所有Git对象)创建refs目录: mkdir .git/refs (存储引用信息)验证: 执行git status会提示not a git repository说明结构还不完整3.2 设置HEAD指向当前活跃的分支操作: echo ref: refs/heads/master .git/HEAD作用:HEAD文件指向当前活跃分支此处设置为指向master分支的最新提交验证: 再次执行git status会显示on branch master确认仓库初始化成功3.3 创建对象流程:创建blob对象:写入文件内容: echo content file.txt生成blob: git hash-object -w file.txt验证: git cat-file -t hash返回blob更新索引:git update-index --add --cacheinfo 100644 hash filename创建tree对象:git write-tree生成目录结构创建commit对象:git commit-tree tree-hash -m message存储结构:objects目录以哈希前两位为子目录每个对象存储在对应哈希目录下3.4 创建分支创建分支步骤:创建分支引用文件: echo commit-hash .git/refs/heads/branch-name切换分支: echo ref: refs/heads/branch-name .git/HEAD分支原理:分支本质是指向commit的轻量级指针HEAD指向当前分支分支指向最新commit提交历史通过commit的父指针连接多分支操作:新commit需手动更新分支引用分支切换需同时更新HEAD和工作区