本文不是对 Git 的完整介绍,只是想说明学习理解 Git 相关概念的重要性。理解了 Git 的术语和模式后,对 Git 的使用会事半功倍
概念简介
术语
- 分布式(distributed):代码仓库分布在不同的客户端和服务端,每个地方都包括完整的数据、完整的历史记录
- 校验和(checksumming):数据的引用(可以理解为数据的 key)。由 40 个十六进制字符(0-9 和 a-f)组成的字符串,基于 Git 中文件的内容或目录结构计算出来,比如:
24b9da6552252987aa493b52f8696cd6d3b00373
- 快照(snapshot):一个 commit 就是一份快照,包括从项目根目录开始的所有文件和目录
- 变更集(changeset):新 commit 引入的所有变化
- 分离头指针(detached HEAD):脱离了分支或者 tag 的 HEAD,这种情况下创建的 commit 可能会丢失
文件的三种状态
- 已修改(modified)表示修改了文件,但还没保存到数据库中
- 已暂存(staged)表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中
- 已提交(committed)表示数据已经安全地保存在本地数据库中
三个区域(与三种状态一一对应)
- 工作区是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改
- 暂存区保存了下次将要提交的信息,一般在 Git 仓库目录中
- Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方
图片来自 git-scm.com/
命令简介
文件操作
git add
跟踪新文件、暂存已修改的文件git commit
提交暂存区更新git rm <filename>
移除文件git rm --cached <filename>
移除 Git 对文件的跟踪,也可以用于取消暂存git reset HEAD <filename>
将文件修改为指定状态git mv <filename> <new-filename>
文件重命名git checkout
切换分支或重置工作区内容git clean
移除未跟踪文件git restore
恢复文件git help <command>
帮助信息
比较:
git diff
比较工作目录和暂存区之间的差异git diff --cached
或git diff --staged
比较暂存区与 HEAD 之间的差异git diff HEAD
比较工作区与 HEAD 之间的差异git diff branch1 branch2
比较不同 commit 之间的差异
.git
- HEAD 文件:HEAD 文件通常是一个符号引用(symbolic reference),指向目前所在的分支。 所谓符号引用,表示它是一个指向其他引用的指针
- refs 目录: tags、heads、origin
- objects 存放对象数据,对象类型: 数据对象(blob object)、树对象(tree object)、提交对象(commit object)、标签对象(tag object)
- blob 对象和文件名没有关系,只取决于文件内容,如果两个文件内容相同,就是同一个 blob。可以节约存储空间
- 对同一文件多次修改提交后,会产生多个 Blob 对象?Git 也考虑到这个问题了,所以它会把松散的 blob 做整理,把内容相近的 blob 做增量存储
Git 工作流
业界 Git 工作流
- Git Flow
- GitHub Flow
- GitLab Flow
- Trunk-based Flow
- Aone Flow
Git 工作流选择依据
- 团队规模、团队人员
- 产品特点、产品形态、产品规模、产品发布方式
- 合作团队诉求
- 基础设施状况