Git 学习笔记:从命令到原理1

发布时间:2026/9/6 2:27:41
Git 学习笔记:从命令到原理1 Git 基础操作与核心内部结构从工作区到 Commit ID摘要本文整理 Git 的基础使用流程并补充 .git 文件夹与 Commit ID 的作用。重点是理解文件如何从工作区进入暂存区再通过一次提交形成可追踪的项目快照。关键词Git、版本控制、工作区、暂存区、.git、Commit ID、分支、对象库一、为什么需要版本控制当项目不断迭代时仅靠复制文件夹或手动修改文件名来保存版本容易出现版本混乱、修改内容不透明、难以回退和多人协作困难等问题。版本控制系统会记录项目的变化使每次重要修改都能被定位、比较和恢复。Git 是一种分布式版本控制系统可以管理源代码、文本文件、配置文件以及其他格式的文件。对于图片、视频等二进制文件Git 可以保存版本但通常无法像文本文件那样直观地展示每一行发生了什么变化。二、安装与检查 Git1. 检查是否已安装git--version如果已安装命令会输出 Git 的版本号。命令行参数应使用两个普通短横线–version。2. CentOS 7.6sudoyuminstallgit-y如果确实需要卸载已有版本可以执行sudoyum removegit-y通常不需要为了安装 Git 先卸载已有版本是否卸载应根据版本要求和系统包管理策略决定。3. Ubuntu 20.04sudoapt-getupdatesudoapt-getinstallgit-y如确实需要卸载已有版本sudoapt-getremovegit-y三、创建本地仓库进入项目目录后执行cd项目目录gitinit也可以在初始化时指定默认分支名gitinit-bmain执行初始化后当前目录会出现一个隐藏的 .git 文件夹。它保存仓库的元数据、对象数据库、引用和暂存区等内容是 Git 管理项目的核心。不要手动修改 .git 内部文件。需要改变仓库状态时应优先使用 Git 命令否则可能破坏本地仓库。需要注意初始化后的分支不一定叫 master。分支名可能由 Git 版本、init.defaultBranch 配置项或 git init -b 决定应以当前仓库的实际状态为准。四、配置提交者信息每次提交都会记录作者和提交者信息常见配置项是 user.name 和 user.email。不带 --global 时配置只对当前仓库生效带 --global 时对当前用户在本机管理的多个仓库生效。仓库级配置通常会覆盖全局配置。gitconfig user.namepineapplegitconfig user.email123456789example.com设置全局配置gitconfig--globaluser.namepineapplegitconfig--globaluser.email123456789example.com查看配置gitconfig--list--localgitconfig--list--globalgitconfig--list--show-origin删除配置gitconfig--unsetuser.namegitconfig--global--unsetuser.name五、理解 Git 的基本工作流Git 的基础工作流可以分为三个主要区域区域作用工作区working tree当前目录中正在编辑的文件暂存区index / staging area下一次提交准备包含的内容提交历史repository已经提交的项目快照和历史关系完整流程是在工作区修改文件使用 git add 选择要提交的内容再使用 git commit 形成新的提交。1. 查看状态和差异gitstatusgitdiffgitdiff--cachedgit diff 默认比较工作区与暂存区git diff --cached 比较暂存区与当前提交HEAD。两者结合使用可以确认“工作区改了什么”和“下一次准备提交什么”。2. 添加到暂存区gitaddREADME.mdgitaddsrc/app.jsgitadd.git add 添加的是命令执行时指定文件的当前内容。之后如果文件再次修改新的修改不会自动进入暂存区需要再次执行 git add。被 .gitignore 忽略的文件默认不会被添加。3. 创建提交gitcommit-m完善 Git 基础操作说明git commit 默认只提交已经进入暂存区的内容不会自动包含工作区中尚未暂存的修改。提交成功后当前分支引用会向前移动指向新生成的提交。4. 查看提交历史gitloggitlog--onelinegitshowcommit-idgit log 默认按时间从近到远展示当前引用可达的提交记录–oneline 使用较简洁的单行形式展示。六、.git 文件夹内常见内容.git 的具体文件和目录可能因 Git 版本、仓库状态、引用存储格式以及执行过的操作而不同。下面是常见内容及其作用。路径作用HEAD表示当前检出位置通常指向当前分支也可能直接记录某个提交 IDconfig当前仓库的配置文件例如仓库级用户名、邮箱和远程仓库信息index暂存区的内部文件记录下一次提交准备包含的路径、模式和内容对象objects/Git 对象数据库保存 blob、tree、commit、tag 等对象对象也可能被压缩到 pack 文件中refs/heads/本地分支引用例如 refs/heads/main通常指向该分支最新提交refs/tags/标签引用用于给特定对象起一个稳定、易读的名称logs/引用日志reflog相关记录用于追踪 HEAD 或分支引用曾经指向过哪里hooks/仓库钩子脚本目录可用于提交前检查等自动化操作info/exclude只对当前仓库生效的忽略规则不会随仓库提交给其他协作者packed-refs某些引用被压缩存储时使用的文件FETCH_HEAD某些获取远程仓库操作产生的临时记录并非所有时刻都存在HEAD、分支和提交之间的关系在正常检出状态下可以把关系理解为HEAD - main - commit-id查看当前分支gitbranch --show-current查看 HEAD 当前解析到的提交gitrev-parse HEADHEAD 通常指向当前分支而当前分支引用再指向该分支最新提交。七、Commit ID 的作用1. Commit ID 不是简单的流水号Commit ID 也称 commit hash 或 commit object name是根据提交对象内容计算出的标识。默认对象格式通常使用 SHA-1表现为 40 位十六进制字符串Git 也支持在初始化时选择 SHA-256 对象格式的仓库。因此Commit ID 不是“第几个提交”也不是 Git 自动递增的编号。2. 一个提交对象记录了什么一个提交对象通常包含项目在该时刻的顶层 tree 对象间接描述目录结构和文件内容一个或多个 parent 提交用于连接历史合并提交可能有多个父提交作者、提交者、时间戳和提交说明。由于提交对象引用了目录树和父提交当提交内容或历史关系发生变化时Commit ID 也会变化。Git 可以通过对象之间的引用关系组织历史并对历史内容提供完整性校验。3. 前两位为什么不是 Commit ID 的含义在 loose object 存储形式下一个完整对象 ID 可能被拆成如下路径完整对象 IDabcdef1234567890... 存储路径.git/objects/ab/cdef1234567890...这里的前两位只是为了把对象分散到子目录中的存储布局不代表提交类型、分支、时间或版本号。对象也可能已经被放入 .git/objects/pack 的 pack 文件中因此不能假定每个 Commit ID 都能在 .git/objects/前两位/ 下找到一个独立文件。4. Commit ID 的实际用途定位当前提交gitrev-parse HEAD查看某次提交的内容gitshowcommit-id比较两个版本gitdiffcommit-id-1commit-id-2撤销某次提交gitrevertcommit-id将某次提交复制到当前分支gitcherry-pickcommit-id检查对象类型gitcat-file-tcommit-idgitcat-file-pcommit-idGit 允许在对象可以被唯一识别时使用缩写 ID但协作沟通、脚本和审计记录更适合使用完整 ID或至少确认当前仓库中该缩写没有歧义。八、一个完整的最小示例mkdirgit-democdgit-demogitinit-bmaingitconfig user.namepineapplegitconfig user.email123456789example.comecho# Git DemoREADME.mdgitstatusgitaddREADME.mdgitdiff--cachedgitcommit-m初始化项目gitlog--oneline这组命令对应的状态变化是README.md 先出现在工作区执行 git add 后文件内容进入暂存区执行 git commit 后Git 形成一个提交对象当前分支引用和 HEAD 一起指向这个提交之后每次新的提交都会产生新的 Commit ID。九、容易混淆的几个点git add 不是保存到最终历史而是选择下一次提交的内容。git commit 默认只提交暂存区不会自动包含所有未暂存修改。分支不是一份独立复制的代码目录而是指向提交的可移动引用。.git 不是普通缓存目录删除或错误修改它可能导致本地历史、分支和配置丢失。Commit ID 标识的是一个对象前两位目录拆分属于 loose object 的存储实现不是 ID 的语义。二进制文件可以被 Git 版本化但差异查看、合并和仓库体积管理需要额外考虑。总结Git 的基础操作可以围绕一条主线理解工作区负责编辑暂存区负责选择提交负责形成快照分支和 HEAD 负责指向快照.git 负责保存这些关系和对象。Commit ID 是提交对象的内容地址既用于精确定位一个版本也用于连接提交历史、检查历史一致性以及支持回退、比较、撤销和协作。参考资料Git 官方git-initGit 官方git-addGit 官方git-configPro GitGit ObjectsPro GitGit ReferencesPro GitViewing the Commit History

相关新闻