Appearance
附录 F:术语表
按字母/拼音排序的 Git 术语速查表。
A
amend(修正) 使用 git commit --amend 修改最近一次提交。可以修改提交信息或追加文件。注意:只应在未推送时使用,修改历史对已推送的提交会造成问题。
annotated tag(附注标签) 包含标签信息(作者、日期、说明)的标签。使用 git tag -a 创建,可以包含 GPG 签名,比轻量标签更正式。对比:lightweight tag。
autosquash(自动压缩) 交互式 rebase 时的一个功能。如果提交信息以 fixup! 或 squash! 开头,Git 会自动将其移动到对应提交后并标记为 squash/fixup 操作。通过 git rebase -i --autosquash 或配置 rebase.autosquash = true 启用。
B
bare repository(裸仓库) 没有工作目录的仓库,只包含 .git 目录的内容。通常用于服务器端,作为团队共享的中央仓库。使用 git init --bare 创建。
bisect(二分查找) 使用二分法定位引入 Bug 的提交。通过 git bisect start、git bisect good、git bisect bad 操作,Git 自动选择中间提交进行测试,直到找到问题提交。
blob(二进制大对象) Git 对象类型之一,存储文件内容(不含文件名或元数据)。文件内容经过压缩后以 blob 对象存储在 .git/objects/ 中。
branch(分支) 指向某个提交对象的可变指针。本质上是 .git/refs/heads/ 目录中的一个文件,内容是提交哈希。创建分支非常轻量,开销极小。
BREAKING CHANGE(破坏性变更) API 或行为的不向后兼容变更。在 Conventional Commits 规范中,在提交 footer 中用 BREAKING CHANGE: 标注,或在 type 后加 !。会触发语义化版本的 major 版本升级。
C
cherry-pick(摘取提交) 将某个提交的变更应用到当前分支。使用 git cherry-pick <commit> 操作。与 merge/rebase 不同,cherry-pick 会创建新提交,内容与原提交相同但 hash 不同。
CI/CD(持续集成/持续部署) 自动化构建、测试、部署流程。与 Git 的集成体现在:push/merge 时触发构建,tag 时触发发布,PR/MR 时运行测试。
clone(克隆) 下载远程仓库的完整副本,包括所有历史记录。使用 git clone <url> 操作。
commit(提交) Git 历史中的一个快照,包含:树对象(文件目录树)、父提交引用、作者信息、时间戳和提交信息。是 Git 的基本存储单元。
commit hash(提交哈希) 提交对象的 SHA-1 哈希值,通常显示为 40 位十六进制字符(也可缩写为前 7 位)。唯一标识一个提交。
conflict(冲突) 当两个分支修改了同一文件的同一区域时,Git 无法自动合并,会标记冲突区域(使用 <<<<<<<, =======, >>>>>>> 标记),需要手动解决。
content-addressable storage(内容寻址存储) Git 的存储原理:根据内容计算哈希值,相同内容的文件只存储一次。这使 Git 能高效去重,并保证数据完整性。
CODEOWNERS GitHub/GitLab 的功能,在仓库根目录、.github/ 或 docs/ 中创建 CODEOWNERS 文件,指定代码区域的所有者。当 PR 修改了对应文件时,所有者会被自动请求 Review。
Conventional Commits(约定式提交) 一种提交信息格式规范,格式为 type(scope): description。使机器能解析提交历史,自动生成 CHANGELOG 和版本号。
D
DAG(有向无环图) Git 提交历史的数据结构。每个提交指向其父提交,形成有向图,且无环(提交不能是自己的祖先)。
delta(差量) Pack 文件中的优化技术:相似对象只存储差异(delta),而非完整内容。大幅减少存储空间。
detached HEAD(游离的 HEAD) 当 HEAD 直接指向某个提交(而非某个分支)时的状态。在此状态下提交的内容如果不保存到分支,可能在切换分支后丢失。
F
fast-forward(快进合并) 当目标分支是源分支的直接祖先时,Git 默认进行快进合并:直接移动指针,不创建新的合并提交。历史保持线性。
fetch(获取) 从远程仓库下载对象和引用,但不修改本地工作目录或当前分支。使用 git fetch 操作,之后可以查看远程变更再决定如何合并。
fixup(修正提交) 以 fixup! <original message> 为消息的提交,配合 --autosquash 使用,在 rebase 时会自动并入对应提交,不保留自己的提交信息(与 squash 的区别)。
force push(强制推送) 用本地分支覆盖远程分支,即使它们的历史不兼容。git push --force 是危险操作,建议使用 git push --force-with-lease(更安全,如果远程有你不知道的提交则失败)。
fork(派生) 在代码托管平台(GitHub/GitLab 等)上克隆他人仓库到自己账户下,获得完全控制权的副本。常用于开源贡献流程。
G
gc(垃圾回收)git gc 命令执行仓库维护工作:清理不可达对象、打包松散对象、压缩引用日志等,减小仓库体积。
gitignore.gitignore 文件指定哪些文件/目录不被 Git 追踪。支持通配符,有 project/global/system 三级。
H
HEAD 指向当前分支最新提交的特殊引用(符号引用)。文件位于 .git/HEAD,通常内容为 ref: refs/heads/main。
hook(钩子) 在特定 Git 操作前后自动执行的脚本。位于 .git/hooks/ 目录。分客户端(pre-commit、commit-msg 等)和服务端(pre-receive、post-receive 等)两类。
Husky Node.js 项目中管理 Git Hooks 的工具,支持将钩子配置保存在 package.json 中,与团队共享。
I
index(索引) 暂存区的另一个名称。Git 内部叫做 index,存储于 .git/index 文件。git add 操作就是将文件变更写入 index。
L
lightweight tag(轻量标签) 只是一个提交引用的标签,不包含额外信息。使用 git tag <name> 创建。对比:annotated tag。
LFS(Large File Storage) Git LFS 是处理大文件的扩展,将大文件存储在独立服务器,仓库中只保存指针文件。避免 Git 仓库因大文件变得臃肿。
M
main/master 仓库的主分支名称。GitHub 在 2020 年将默认分支名从 master 改为 main。两者功能相同,只是命名不同。
merge(合并) 将两个分支的历史合并。默认创建一个合并提交(包含两个父提交),可以通过 --no-ff 强制创建,或 --squash 合并所有变更为一个提交。
merge commit(合并提交) 合并操作创建的提交,有两个或多个父提交。可以用 git log --graph 可视化看到。
monorepo(单体仓库) 将多个项目/包放在同一个 Git 仓库中管理。优点是代码共享方便、统一版本;缺点是仓库规模大,需要专门工具(Turborepo、Nx 等)辅助。
MR(Merge Request) GitLab 中的术语,等同于 GitHub 的 Pull Request(PR)。是代码 Review 和合并的基本单位。
O
object(对象) Git 存储的基本单位,分为四种:blob(文件内容)、tree(目录结构)、commit(提交)、tag(标签)。所有对象都由 SHA-1 哈希标识,存储在 .git/objects/。
origin 克隆仓库时自动设置的默认远程仓库名称。可以通过 git remote rename origin <name> 修改。
P
pack file(包文件) Git 将多个松散对象打包成一个 .pack 文件(及对应的 .idx 索引文件),提高存储效率。git gc 时会执行打包。
patch(补丁) 描述代码变更的文件,可以通过 git format-patch 生成,用 git apply 或 git am 应用。在没有直接仓库访问权限时传递代码变更的方式。
PR(Pull Request) GitHub 中的术语,表示"请求合并你的代码"。开发者在功能分支开发完成后,向主分支发起 PR,其他人 Review 后合并。
prune(修剪) 清理无用数据。git prune 删除不可达的松散对象;git fetch --prune 删除已在远程删除的分支的本地追踪引用。
R
rebase(变基) 将一系列提交"移植"到另一个基提交上,生成新的提交(hash 不同)。使历史保持线性,但会改写历史,不应用于已推送的公共提交。
reflog(引用日志) 记录本地仓库中引用(HEAD、分支等)变动历史的日志,存储于 .git/logs/。可用于找回丢失的提交。有效期默认 90 天。
remote(远程) 其他地方(通常是服务器上)的仓库副本。通过 git remote add 关联,使用 git fetch/pull/push 进行数据同步。
remote tracking branch(远程追踪分支) 本地对远程分支状态的快照,如 origin/main。在执行 git fetch 后更新,不能直接在上面提交。
repository(仓库) 包含项目所有版本历史的数据库,对应 .git 目录。分为本地仓库(working + .git)和裸仓库(只有 .git 的内容)。
rerere(复用已记录的解决方案)git rerere(Reuse Recorded Resolution)功能。记录冲突解决方案,当再次遇到相同冲突时自动应用。通过 rerere.enabled = true 配置启用。
reset(重置) 移动 HEAD(和分支指针)到指定提交。三种模式:
--soft:只移动 HEAD,保留暂存区和工作区--mixed(默认):移动 HEAD,清空暂存区,保留工作区--hard:移动 HEAD,清空暂存区和工作区
revert(回退) 创建一个新提交,内容是指定提交的逆操作(撤销那次提交的变更)。不改写历史,安全。
S
SHA-1 Git 用于计算对象 ID 的哈希算法,产生 40 位十六进制字符串。内容相同的对象 SHA-1 相同,这是 Git 内容寻址的基础。(注:Git 正在逐步迁移到 SHA-256)
shallow clone(浅克隆) 使用 git clone --depth <n> 创建,只克隆最近 n 次提交的历史,减少克隆时间和存储。常用于 CI/CD 环境。
sparse checkout(稀疏检出) 只检出仓库的特定子目录,而非全部文件。适合 Monorepo 场景,避免下载不需要的代码。
squash 将多个提交合并为一个。可以在 git rebase -i 中使用 squash 命令,或在 git merge --squash 时自动合并所有提交。
stash(储藏) 临时保存当前工作目录和暂存区的未完成工作,让工作区回到干净状态。使用 git stash 保存,git stash pop 恢复。
submodule(子模块) 在一个 Git 仓库中嵌入另一个 Git 仓库。父仓库只记录子模块的仓库地址和特定提交,不直接存储子模块的内容。
subtree(子树) 将另一个仓库的内容直接包含在父仓库的子目录中。与 submodule 不同,subtree 不需要额外配置,普通用户克隆时无感知。
T
tag(标签) 指向特定提交的固定引用,不像分支会随提交移动。常用于标记发布版本。分轻量标签和附注标签两种。
three-way merge(三路合并) 合并两个分支时,Git 找到它们的公共祖先(merge base),然后将各自的变更合并。是 git merge 的默认行为(非 fast-forward 时)。
tree(树对象) Git 对象类型之一,代表目录,存储文件名、文件权限和指向 blob 或其他 tree 对象的引用。
Trunk Based Development(主干开发) 一种分支策略:所有开发者在主干(main/trunk)分支上工作,或使用短生命周期(1-2天)的功能分支,频繁合并到主干。
U
upstream(上游) 在 Fork 工作流中,指原始仓库(你 Fork 来的那个仓库)。你的 Fork 叫做 origin,原始仓库叫做 upstream。也指本地分支追踪的远程分支(git branch -u origin/main)。
W
working directory / working tree(工作目录) 你实际编辑文件的本地目录。是 Git 三个区域(工作目录、暂存区、仓库)之一。
worktree(工作树) Git 允许一个仓库对应多个工作目录(git worktree add)。可以同时在多个分支上工作,无需 stash 或 clone。
符号说明
| 符号 | 含义 |
|---|---|
HEAD | 当前分支的最新提交 |
HEAD~n | 从 HEAD 回退 n 次(沿第一父线) |
HEAD^n | HEAD 的第 n 个父提交(用于合并提交) |
origin/main | 远程追踪分支 |
.. | A..B 表示 B 中有但 A 中没有的提交 |
... | A...B 表示 A 和 B 各自独有的提交 |
@ | 在新版 Git 中可作为 HEAD 的别名 |
@{-1} | 上一个检出的分支 |
@{upstream} 或 @{u} | 当前分支的上游分支 |