Skip to content

附录 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 startgit bisect goodgit 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 applygit 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^nHEAD 的第 n 个父提交(用于合并提交)
origin/main远程追踪分支
..A..B 表示 B 中有但 A 中没有的提交
...A...B 表示 A 和 B 各自独有的提交
@在新版 Git 中可作为 HEAD 的别名
@{-1}上一个检出的分支
@{upstream}@{u}当前分支的上游分支