首页/开发/Git 与协作速查

Git 与协作速查

提交与分支命令、分支模型(GitFlow / Trunk-Based)、合并变基与冲突解决、PR/MR 评审、子模块与大仓实践:团队版本控制速查。

共 352 条更新于 2026-10-12所属领域:开发
共 352 条

Git 基础与命令88 条

工作区/暂存区/提交、日志检索与回退

git commit 创建提交热门

把暂存区内容记录为提交:默认打开编辑器撰写信息,-m 直接给出,-a 跳过手动暂存直接提交已跟踪文件的修改。

git clone 克隆仓库热门

把远端仓库复制到本地:自动配置 origin、拉取默认分支并建立跟踪关系,支持指定分支、目录名与子模块递归。

git add 暂存改动热门

把改动加入暂存区,是提交的前置步骤;可整目录、按路径或按补丁块暂存,-A 与 -u 对新增、删除的处理范围不同。

git log 查看提交历史热门

浏览提交历史:-n 限制条数、--oneline 简洁输出、--no-merges 过滤合并提交;是定位改动与复盘的起点命令。

git status 查看仓库状态热门

查看工作区与暂存区差异:哪些改动已暂存、哪些未暂存、哪些文件未跟踪;是提交前确认改动范围的固定动作。

git push 推送提交热门

把本地提交送到远端:默认推当前分支到其上游(push.default=simple);支持 refspec 映射与 --dry-run 演练。

git diff 查看未暂存差异

比较工作区与暂存区的改动;git diff HEAD 则显示工作区相对 HEAD 的全部差异,是提交前自查的基本视角。

git config 配置读写与常用项

读写 Git 配置的入口命令:管理提交身份、编辑器、换行符与别名等,支持 local、global、system 三级作用域,可用 --show-origin 追踪配置来源。

git pull 拉取并集成

pull 等价于 fetch 加集成(默认 merge,可配置 rebase);--ff-only 只允许快进,能避免不在预期内的合并提交。

.gitignore 忽略规则

声明无需纳入版本控制的文件:按目录生效、支持通配与否定;忽略规则只对未跟踪文件生效,已跟踪文件需要先移出索引。

git stash 保存工作现场

把已跟踪文件的改动与暂存状态存入 stash 栈,工作区回到干净状态;默认不含未跟踪文件,可用消息标记用途。

git init 初始化仓库

在当前目录创建 Git 仓库:生成 .git 目录与初始配置;-b 可指定初始分支名,也可用 init.defaultBranch 设定默认值。

git restore 复原文件与暂存区

复原工作区或暂存区:默认丢弃工作区改动,--staged 取消暂存,--source 从历史版本取回内容。

git commit --amend 修补上一条提交

改写上一条提交:补文件或改信息,生成新的提交哈希;默认保留作者与作者时间,更新提交者信息与时间。

git fetch 只下载不合并

从远端取回对象与引用更新而不动工作区:把远端变化安全地拿到本地,评审后再决定合并或变基。

git clone --depth 浅克隆

浅克隆只取有限条提交:--depth=N 控制深度,明显减少拉取体积与时间,适合 CI 与只需要新近代码的场景;代价是历史不完整。

git diff --staged 复核待提交内容

检查即将进入提交的改动:--staged 等价 --cached,比较暂存区与 HEAD,是提交前的一道复核。

git show 查看对象内容

查看单个对象:提交(默认包含补丁)、标签、树;--stat 只看摘要,-s 只看提交信息。

git revert 反向提交回退

用新提交抵消既有改动:不改写历史,适合已推送内容的安全回退;-n 只应用不提交,-m 用于撤销合并提交。

git add -p 交互式暂存

逐块选择改动进入暂存区:-p 按补丁块询问是否暂存,是拆分提交、保持提交粒度的常用工具;-e 可手工编辑补丁块。

git log 图形化速览组合

--oneline --graph --decorate --all 组合成分支拓扑视图:一行一条提交,显示引用名与分叉合并关系。

git reset 默认模式(--mixed)

默认行为:重置暂存区但保留工作区改动;用于取消全部暂存,或回退提交后重新挑拣文件。

git remote 管理远端仓库

查看与维护远端:-v 显示地址,add/rename/remove 管理条目;克隆产生的默认远端名为 origin。

git blame 逐行追溯变更

逐行显示最后一次改动该行的提交与作者:-L 限定行区间、-C 探测跨文件复制来源、--show-email 显示邮箱。

git config 作用域与优先级

理解三级配置的覆盖关系:local 覆盖 global、global 覆盖 system;同名键按就近原则生效,排查配置问题时先确认读取来源。

git log 按作者时间关键词筛选

精炼历史查询:--author 查作者、--grep 查信息、--since/--until 限定时间窗,多个条件默认取交集。

git tag 标签基础

给提交打标签:列出、创建、删除与推送;标签默认不随 push 自动上传,需要显式推送目标标签。

提交信息结构与多段写法

提交信息约定:首行主题句、空行、正文说明动机;可用多个 -m 拼段落,或用 -F 从文件读取,-v 在编辑器中附带 diff 预览。

git reset --hard 硬重置

回退到指定提交并同步丢弃暂存与工作区改动;未提交的改动无法找回,只适合放弃明确的本地实验。

git push -u 建立跟踪关系

推送新分支时用 -u/--set-upstream 记录上游:之后 git push、git status 与 git pull 都能直接对应远端分支。

git reflog 引用日志

记录 HEAD 与分支指针的每次移动:误重置、误删分支后的找回线索,默认保留 90 天(可配置)。

git status --short 短格式与脚本解析

面向脚本的稳定输出:--short 简洁显示,--porcelain=v1/v2 格式稳定;两列 XY 分别对应暂存区与工作区状态。

git rm 删除文件并记录

删除文件并暂存删除动作;--cached 只把文件移出版本库、保留磁盘内容,适合把误提交文件停止跟踪。

git diff --stat 差异摘要

变更规模概览:--stat 输出每个文件的增删行数,--numstat/--name-only/--name-status 供脚本与评审流程使用。

git stash pop 与 apply 的区别

取回现场:pop 恢复后把记录从栈中删除,apply 恢复但保留副本;list/show 查看,drop/clear 删除记录。

git bisect 二分定位回归

手动二分:start 进入流程,标记 good/bad 后逐次检出中点,收敛到引入问题的提交;结束时 reset 退出。

git init --bare 裸仓库

创建不含工作区的裸仓库,作为团队共享的服务端仓库或迁移中转站;--shared 控制组用户写权限,服务端钩子放在 hooks 目录。

git mv 移动与重命名

移动或重命名文件并同步索引;Git 按内容相似度识别重命名,先 mv 再 add 与 git mv 的最终效果接近。

git log -S / -G 检索内容变更

按内容检索历史:-S 记录某字符串出现次数的变化(新增或删除),-G 对 diff 文本按正则匹配,用来定位代码或配置何时引入。

git log 按路径过滤历史

只看影响指定路径的提交:git log -- <路径>;对单个文件用 --follow 可穿透重命名继续追历史。

git clean 清理未跟踪文件

删除未跟踪文件与目录:-n 先演练列出将删项,-f 执行,-d 处理目录,-x 连忽略文件一起清、-X 只清忽略文件。

git push --force-with-lease 带租约强推

有条件强推:当远端引用仍是你预期的位置时才允许覆盖,比 --force 多一层防误覆盖保护,适合 rebase 后推个人分支。

git clone --single-branch 单分支克隆

只抓取指定分支的引用,进一步压缩传输数据;默认与 --depth 组合使用。后续需要其他分支时可调整 remote 的 refspec 再拉取。

提交区间 A..B 与 A...B

区间语法查差异:A..B 是「在 B 不在 A」,A...B 是两分支的对称差,配 --left-right 标出每个提交属于哪一侧。

git reset 取消单个文件的暂存

带路径参数时只把该文件移出暂存区、不移动分支指针,等价于 git restore --staged 的效果。

git grep 在版本库中搜索

在已跟踪文件里搜索内容:默认搜索工作区,-n 显示行号、-l 只列文件、--count 计数,也可直接在指定提交上搜索。

git alias 命令别名

把高频命令缩写为短命令:alias.* 配置项,! 前缀定义执行 shell 的别名,可组合多步逻辑。

git clone --mirror 镜像克隆

镜像克隆得到包含全部引用(分支、标签与远端配置)的裸仓库,常用于仓库迁移与站点镜像,配合 push --mirror 整体推送。

git reset --soft 只移动分支指针

撤销提交但保留暂存区与工作区:改动原样停留在暂存状态,适合把多条提交合并为一条或重写提交内容。

git stash -u 纳入未跟踪文件

扩展入栈范围:-u 连未跟踪文件一起保存,-a 连被忽略文件也纳入,-k 在保存时保留暂存区状态。

git fetch --prune 清理远端跟踪引用

删除远端已清除的本地下游引用:git fetch --prune 或 git remote prune origin;可设 fetch.prune=true 作为默认行为。

git gc 仓库整理与打包

整理仓库:打包松散对象、压缩引用与清理临时文件;--auto 由日常操作自动触发,无需频繁手动调用。

git add -N 记录新增意图

intent-to-add 把新文件登记进索引但不暂存内容,让 git diff 能看到未暂存的新文件差异,便于走补丁式暂存流程。

git show 查看某版本文件内容

git show <rev>:<path> 直接输出指定提交中的文件内容,不需要切换分支;可重定向导出后与当前版本比对。

git remote set-url 修改远端地址

更换远端地址:HTTPS 与 SSH 互转、域名迁移都用它;--push 可以为推送单独指定地址。

git push --tags 推送标签

推送标签到远端:--tags 推全部本地标签,--follow-tags 只推送被已推提交可达的附注标签,发布流程更可控。

找回悬空提交与误删数据

恢复流程:fsck --lost-found 或 reflog 定位无引用提交,git show 核对内容后用 branch/reset 接回历史。

全局忽略文件 core.excludesFile

个人级忽略清单:用 core.excludesFile 指定(默认路径在用户配置目录下),适合编辑器临时文件与系统文件,不随仓库分发。

附注标签与签名标签

-a 创建带说明的标签对象(记录打标签者与日期),-s 使用 GPG 签名;发布标记建议使用附注标签。

git push --delete 删除远端分支或标签

删除远端引用:git push origin --delete <名称>;等价写法为 push origin :<名称>,需要相应写权限。

Git 传输协议与接入方式

常见协议:本地路径、SSH(git@)、HTTPS 与 git://;认证方式、端口与适用网络环境各不相同。

git check-ignore 排查忽略原因

定位「为什么这个文件被忽略了」:-v 显示命中的规则与来源文件;--no-index 可检查未被跟踪的路径。

git diff --word-diff 词级比较

以单词为粒度标记增删:--word-diff 输出词级标记、--color-words 用颜色呈现,适合长行或文档类修改的阅读。

git tag 过滤与排序

标签查询:-l 通配过滤、-n 附带说明行、--sort 指定排序(版本自然序用 v:refname)、--contains 反查提交所属标签。

git archive 导出发布包

把指定版本打包为 tar/zip:不含 .git 目录,--prefix 添加顶层目录,.gitattributes 中 export-ignore 的路径会被排除。

git credential 凭据管理

用 credential.helper 管理远端认证凭据:cache 缓存在内存、store 写入明文文件、系统钥匙串集成方案更安全。

.git/info/exclude 本地私有忽略

只在当前克隆生效的忽略清单,适合「仅我不想提交」的临时文件;不随仓库分发,优先级低于目录内的 .gitignore。

git shortlog 贡献统计

汇总提交者与提交数量:-sn 按数量排序、-e 显示邮箱、可指定区间统计发布周期内的贡献。

git stash 部分路径与交互块

只存一部分改动:stash push -p 交互挑选块,或 git stash push -- <路径> 限定目录,其余改动留在工作区继续用。

git describe 生成可读版本号

用标签描述任意提交:输出「标签-距离-短哈希」形式,--dirty 标记工作区有改动,常用于构建号与版本标识。

git bisect run 自动化二分

无人值守二分:让脚本对每个候选版本执行验证,按退出码判定好/坏,自动收敛并输出结果。

git rev-parse 解析引用与路径

脚本取值的常用命令:--show-toplevel 取仓库根、--abbrev-ref 取分支名、--short 取短哈希、--verify 校验引用。

core.autocrlf 换行符策略

控制检出与提交时的 CRLF/LF 转换;跨平台项目更推荐在 .gitattributes 声明 text=auto,让规则随仓库分发。

git diff --check 空白错误检查

检查新增行中的空白问题(行尾空白、tab 前空格等);接入 CI 可把这类噪音拦在合并之前。

refspec 引用映射语法

refspec 描述「抓取什么、放在哪」:[+]<源>:<目标>;默认把远端分支映射到 refs/remotes/<远端>/ 下形成跟踪分支。

git blame 忽略批量格式化提交

让 blame 穿透格式噪音:把重格式化提交哈希写进清单文件,配置 blame.ignoreRevsFile 或临时 --ignore-rev 指定。

git fsck 仓库一致性检查

扫描对象库与引用:报告缺失对象、悬空对象与结构问题,是仓库体检与故障排查的入口命令。

git difftool 调用外部比较工具

把差异交给图形化工具逐文件浏览:配置 diff.tool 后执行 git difftool,-d 进入目录比较模式,--staged 比较待提交内容。

git ls-files 列出索引文件

查看暂存区(索引)中的跟踪文件:--stage 显示模式与对象哈希,-o 列未跟踪、-m 列已修改,适合核对提交范围。

git count-objects 对象库统计

查看对象数量与磁盘占用:-v 详细、-H 人类可读;区分松散对象与打包体积,是仓库瘦身排查的起点。

git bundle 离线打包传递

把对象与引用打包成单一文件:clone、fetch 可直接把它当远端使用,适合隔离网络环境搬运仓库。

git cat-file 查看 Git 对象

检视对象库内容:-t 类型、-s 大小、-p 按类型美化输出;--batch-check 批量查询对象元信息。

git rev-list 遍历提交集合

输出可达提交的哈希列表:--count 计数、--all 覆盖全部引用、区间语法与 log 一致,是统计脚本的基础。

git 编辑器配置 core.editor

交互场景(提交信息、交互变基)打开的编辑器由 core.editor 决定,GIT_EDITOR 环境变量可临时覆盖。

git prune 清理不可达对象

删除没有任何引用可达的对象;先用 git fsck --unreachable 查看清单,用 -n 演练确认范围。

git ls-tree 查看提交内容清单

列出树对象(提交快照)中的文件与子目录:-r 递归、-l 附对象大小、--name-only 只看路径。

git help 获取帮助

查阅文档:git help <命令> 打开手册页,git <命令> -h 快速查看选项,git help -a 列出全部命令。

git mailmap 归并作者署名

用 .mailmap 把同一人的多个姓名与邮箱映射到一个规范署名,影响 shortlog、log 等展示结果。

分支模型与工作流49 条

分支策略、保护规则与版本发布

git branch 分支基础操作

列出、创建、改名与删除分支;分支本身只是指向提交的轻量指针,创建与切换成本都很低。

git switch 切换分支

Git 2.23 起的新式切换命令:-c 创建并切换、-C 覆盖创建、--detach 进入分离头指针,- 回到上一个分支。

git checkout -b 创建分支(经典写法)

旧式建分支写法:git checkout -b <分支> [起点];理解 checkout 的双重职责,是读懂历史文档与老脚本的前提。

Semantic Versioning 语义化版本

版本号含义约定:MAJOR.MINOR.PATCH;不兼容改动升主版本、兼容新增升次版本、兼容修复升修订号。

分支上游跟踪关系

维护本地分支与远端分支的对应关系:--set-upstream-to 设置、-vv 查看领先落后、--unset-upstream 取消。

GitFlow 分支模型

经典模型:长期维护 main 与 develop,配合 feature/release/hotfix 短分支;合并常用 --no-ff 保留分支聚合痕迹。

短生命周期分支实践

分支存活时间越短,与主线的偏离越小、集成风险越低;按小任务拆分并频繁同步主线是核心要点。

发布分支维护

从主线切出 release/x.y 冻结发布范围;缺陷修复先合主线,再挑回发布分支,保证后续版本不留坑。

检出远端分支建立跟踪

把远端分支拿到本地:switch <名称> 在唯一匹配时自动建立跟踪(DWIM);显式写法为 switch -c <本地> origin/<远端>。

GitHub Flow 工作流

轻量流程:只保留一条长期分支,改动走「开分支 → 提交 → 开 PR → 评审 → 合并」,前提是 main 始终可部署。

删除本地与远端分支

清理分支:-d 安全删除(要求已合并)、-D 强制删除、远端用 push --delete;先用 --merged 核对清单。

GitLab Flow 工作流

在 GitHub Flow 上补充环境分支(如 production)或发布分支,用「上游优先」原则保证修复先落主线再回挑发布线。

查看远端分支列表

git branch -r 列出远端跟踪分支、-a 合并展示;列表来自本地缓存,保持新鲜要先 fetch/prune。

Trunk-Based Development 主干开发

开发者以小批量、高频次把改动合入主干:分支极短(小时到天)或直接提交主干,配套自动化测试与特性开关。

发布打标签流程

发布动作的顺序:确认分支与版本号 → 打附注标签 → 推送标签 → 触发流水线 → 生成发布说明;标签是发布点的可追溯锚点。

Fork 协作模型

外部贡献不直接写入上游仓库:Fork 到自己的命名空间开发,再向上游提 PR/MR,权限边界清晰。

分支命名约定

给分支起可检索的名字:前缀 + 简短描述(如需带工单号),常见前缀有 feat/ fix/ hotfix/ release/。

热修复分支流程

线上紧急修复的专用通道:从发布标签切分支、最小改动、加急评审、打补丁标签,并把修复回流主线。

GitHub 分支保护规则

对主干等分支设置保护:要求 PR 合并、必需评审、必需状态检查与线性历史,阻止直接推送绕过评审。

按合并状态与包含关系筛选分支

反查分支与提交关系:--contains 列出包含某提交的分支、--merged/--no-merged 按合并状态过滤,发布排查常用。

主干开发与持续集成配合

每次合入都触发完整流水线,主干保持绿色;失败立即修复或回滚,是主干模式成立的前提条件。

变更日志规范(Keep a Changelog)

给使用者看的版本化说明:按版本分组,用 Added/Changed/Fixed 等类型记录可感知变化,而不是流水账式提交罗列。

同步上游分支

让本地与 Fork 跟上上游:fetch upstream → 快进本地 main → 推送 Fork → 在特性分支上变基到上游基线。

git branch -m 分支改名

修改本地分支名:-m <新名> 或 -m <旧名> <新名>;远端同步需要「推新分支 + 删旧分支」两步。

分支模型选择参考

按交付节奏、并行版本数与回滚要求选模型:持续部署偏轻量流程,版本化交付用发布分支,复杂场景再考虑完整 GitFlow。

回滚策略与决策

回滚有两层:代码层用 revert 生成反向提交,部署层回退到上一版本制品;同时明确触发条件与决策人。

发布说明与平台 Release

GitHub/GitLab 的 Release 把标签、说明与制品绑定:可先自动生成候选说明,再人工补充升级注意事项与已知问题。

GitLab 保护分支与合并控制

控制谁能推送、谁可合并以及是否允许强推;与合并请求审批、流水线门禁组合,约束主干合入路径。

分支与标签的区别

分支是可移动指针(继续接收提交),标签是固定锚点(指向某次提交不变);开发用分支、发布用标签。

分支列表排序

git branch --sort 按提交日期、作者等排序,配合 -v 显示最新提交;巡检时快速发现长期未动的分支。

环境分支模式

用 pre-production、production 等分支对应部署环境,代码逐级合并推进;结构直观,但合并链路会变长。

版本号提升规则落地

把提升规则变成团队例行动作:修复升 PATCH、兼容新增升 MINOR、不兼容改动升 MAJOR;破坏性改动显式标注。

分支清理例行化

合并即删、过期即查:本地与远端分支定期清理,控制列表规模,降低推错分支与误合并概率。

发布列车节奏

固定节奏发车:到点验收通过的改动随车发布,未就绪的顺延下一班;计划性强、协调成本可控。

发布冻结期管理

发布前短暂冻结:发布分支只接受阻断级修复,其他改动继续走主干常规流程;窗口要短、规则要明确。

默认分支改名(master → main)

把默认分支改名为 main 类约定:平台侧调整默认分支与保护规则,本地与 CI 脚本同步更新引用。

分支同步策略(rebase 或 merge)

本地分支与主线同步的两种口径:rebase 保持线性、评审差异干净;merge 保留时间线、无需强推;团队需要统一约定。

发布检查单

把发布前必做项列成清单:版本号与标签、变更说明、配置与迁移、回滚方案、通知与值守,逐项确认降低遗漏。

预发布版本号

在版本号后附加连字符标识预发布状态(如 1.0.0-rc.1、2.0.0-beta.2);按规范其排序低于对应正式版本。

长期支持(LTS)分支维护

为特定版本提供更长维护窗口:用 maint/x.y(或 release/x.y)分支承接安全与阻断级修复,并公开支持截止时间。

孤儿分支(gh-pages 等独立历史)

创建没有父提交的独立分支,用于静态站点发布(gh-pages)或独立制品,与主线历史互不干扰。

签名标签与验证

对发布标签做密码学签名:-s 使用默认密钥、-u 指定密钥;接收方用 git tag -v 验证,发布来源可核验。

特性开关与主干开发

用开关解耦「合入主干」与「对用户放量」:代码尽早合入,功能默认关闭,按灰度逐步打开。

日历版本号 CalVer

用日期构造版本号(如 2026.10.0、2026.10.12):发布频率高的产品能直观看到时间维度,也可与语义化规则组合。

保护发布标签

在平台将发布标签设为受保护引用:限制创建、删除与覆盖权限,防止发布点被误改或误删。

DORA 交付效能指标

四项指标观察交付效能:部署频率、变更前置时间、变更失败率、恢复时长;用趋势暴露流程与自动化缺口。

GitFlow 工具封装

git-flow(AVH edition 等实现)提供 feature/release/hotfix 子命令封装常见流程;不用工具也能按同一约定手工操作。

里程碑(Milestone)规划

把一批议题与合并请求挂到同一目标(如 v2.5),追踪完成比例与截止时间;发布前核对剩余项决定顺延或移出。

发布审计与追溯

把「标签 + 签名 + 发布说明 + 流水线记录」串成发布链路:出现问题时能回答「当时构建的是哪个提交、经过哪些检查」。

合并变基与冲突71 条

merge/rebase/cherry-pick 与冲突解决

git merge 合并分支热门

把一个或多个分支的提交并入当前分支:可快进时默认移动指针前进,否则生成合并提交;合并前先确认工作区干净,冲突未解决前不要提交。

git rebase 变基重放提交

把当前分支的提交在目标分支顶端逐个重放,得到线性历史;适合个人分支同步主干,不要对已共享的分支做变基。

冲突标记的结构与处理

三方合并失败时 Git 把冲突段落写进文件:<<<<<<< 当前分支、======= 分隔、>>>>>>> 对方分支;解决即人工决定保留内容并删除标记。

git rebase -i 交互式整理提交

在编辑器中列出待重放提交的 todo 清单,可重排、合并、改写、删除提交,是整理分支历史的标准入口。

git merge --abort 中止合并

放弃进行中的合并,把工作区与索引恢复到合并前状态;仅在合并因冲突暂停、尚未提交时可用。

变基还是合并:选择依据

关键判断是「分支是否已共享」与「要不要保留真实集成拓扑」:私有分支重写历史可读性好,公共分支合并更安全。

git merge --continue 完成合并

冲突全部解决并 git add 之后,用它提交合并结果;它与直接 git commit 等价,Semantics 上更明确地表示在推进暂停的合并。

标记冲突已解决并完成操作

冲突文件的解决动作就是 git add(删除文件用 git rm),全部处理后按所处状态收尾:merge --continue 或 rebase --continue。

git cherry-pick 拣选提交

把其他分支的指定提交复制到当前分支,生成内容相同但哈希不同的新提交;常用于把修复同时带到多个版本分支。

git merge --no-ff 保留合并记录

强制生成合并提交,即使可以快进也保留分支拓扑,便于在历史中看出「某组提交作为一个特性」被整体合入;merge.ff=false 可设为默认。

交互式变基 todo 命令表

todo 清单每行可用的指令:pick、reword、edit、squash、fixup、drop、exec、break、label、reset、merge;掌握其中常用几个即可覆盖九成场景。

变基后的安全强推

变基改写了本地分支,推送需要 --force-with-lease:只有在远端仍是你上次看到的位置时才覆盖,降低覆盖他人提交的风险。

git merge --squash 压缩合并

把被合并分支的净差异压成一次「已暂存待提交」的改动,不产生合并提交也不记录父子关系,适合把杂乱的临时分支整理后并入。

变基中断的继续、跳过与放弃

变基过程中遇到冲突或 edit 暂停:解决后 --continue 推进,--skip 放弃当前提交,--abort 回到变基前状态。

git merge --ff-only 只允许快进

当无法快进时直接失败退出,用于保持线性历史或校验「本地分支确实落后于远端」:能快进说明本地没有分叉提交。

冲突时按文件取 ours/theirs

git checkout --ours/--theirs 把单个文件整体取成某一边的版本,用于「整文件以一侧为准」的场景(如锁文件、生成物)。

公共分支不要改写历史

在已推送并被他人拉取的分支上做变基,会让旧提交与重写后的提交并存,制造分叉与重复变更;公共分支只追加提交。

git merge 合并策略选择

git merge 支持多个底层策略:ort(当前默认)、resolve、recursive(历史默认别名)、octopus、ours、subtree;日常几乎只用默认,特殊场景才显式指定。

merge.conflictStyle=diff3 显示共同祖先

默认冲突样式只显示两方版本;切到 diff3 会额外展示 ||||||| 标记后的共同祖先内容,帮助判断双方各自改了什么。

git rebase --autosquash 自动折叠修复提交

与 git commit --fixup/--squash 配合:交互式变基时把 fixup!、squash! 前缀的提交自动排到目标提交之后并标记折叠。

git merge -X ours 冲突块取本分支

双方改到同一区域时,自动选择当前分支一侧的内容而不报冲突;未冲突部分照常合并,是「以我为主」的产线救急手段。

提交前检查冲突标记残留

提交或推送前用 git diff --check 与检索方式扫出 <<<<<<< / >>>>>>> 残留,避免把冲突标记提交进仓库。

git rebase --onto 精确搬移提交

用 --onto 指定新基线与起点,把一段提交从旧位置搬到新位置;典型用途是把误开在错误分支上的提交摘出来。

git pull 的合并与变基配置

pull.rebase 控制 git pull 默认用 merge 还是 rebase:true=变基、false=合并、merges=仅非快进时变基;先想清楚团队策略再设。

git merge --no-commit 预览合并结果

执行合并但因不满足快进条件而暂停在提交之前,便于先检查自动合并是否引入问题,再决定提交或中止。

git merge -X theirs 冲突块取对方版本

双方改到同一区域时自动采用被合并分支一侧的内容,其余改动照常并入;常用于把上游/模板分支更新进本地既有定制。

git pull --ff-only 只快进拉取

拉取时不产生合并提交:远端领先则直接快进,分叉则失败并提示;适合要求线性主干、避免本地随意合并的团队。

git merge 的 ort 策略

ort 是当前默认合并策略,相比 recursive 在重命名、目录改名与长文件列表上更不容易误判,可显著减少「改了却没检测到」的假冲突。

git mergetool 图形化解决冲突

调用外部合并工具逐文件处理冲突;可用 --tool 指定工具,mergetool.keepBackup 控制是否保留 .orig 备份文件。

git commit --fixup 生成修补提交

为指定提交创建 fixup! 前缀的修补提交,之后配合 rebase --autosquash 自动折叠到目标提交,避免反复改写历史。

git merge-base 找共同祖先

计算两个(或多个)提交的合并基础,即分叉点;用于确认分支从哪里分开、构造 rebase --onto 范围与排查合并范围异常。

交互式变基拆分提交

把一个大提交拆成多个:在 todo 中把该行改为 edit,停下后用 git reset HEAD^ 退回到暂存前,再分批暂存提交。

双点与三点差异的区别

git diff A..B 比较两个端点;git diff A...B 比较 A 与「A、B 的共同祖先」到 B 的差异,评审 PR 常用三点视角只看引入的变更。

git merge 忽略空白差异

跨平台协作时行尾与缩进差异会制造大量伪冲突,-X ignore-space-change / ignore-all-space 可在冲突判断时忽略空白变化。

二进制文件冲突处理

二进制文件无法逐行合并,冲突时只能整份二选一;配合 .gitattributes 标记 binary 或为特定类型指定专用合并驱动。

交互式变基重排提交顺序

调整 todo 清单行的顺序即可改变提交应用顺序;用于把相关提交聚在一起,但要注意提交间可能存在依赖。

revert 合并提交(-m)

撤销合并提交必须指定保留哪个父提交:git revert -m 1 <合并提交> 表示「回到主干侧父提交的样子」,之后再要合并该分支需先撤销这次 revert。

git merge --allow-unrelated-histories 合并无共同祖先

两个独立初始化的仓库合并时会因「refusing to merge unrelated histories」被拒;该选项显式放行,常用于把旧仓库历史并入新仓库。

git ls-files -u 查看未合并条目

按索引冲突阶段列出所有未解决文件(stage 1 共同祖先、2 我方、3 对方),适合脚本化统计冲突规模与批量处理。

git log --merge 查看冲突来源

冲突暂停时用 --merge 过滤出「两方历史上真正改过」的提交,快速定位是谁、因为哪些提交引入了冲突。

git rebase --autostash 自动寄存改动

变基前自动把未提交改动暂存、结束后恢复,避免因工作区不干净而中断;结果冲突时需手动处理恢复的改动。

git rebase --exec 逐提交验证

在每条提交重放后执行指定命令(如测试),任一失败即暂停在对应提交;适合清理分支时确认每步都是可用状态。

git range-diff 对比两次变基的结果

比较同一段提交在两个版本(如变基前后、两个 MR 分支)之间的对应关系,回答「这次强制推送改了什么」。

git merge -s ours 记录合并但不取内容

生成一个合并提交、但结果树保持当前分支不变,用来「宣告某分支已被吸收」;旧分支的内容不会进入主干。

merge.conflictStyle=zdiff3 精简版 diff3

zdiff3 在 diff3 基础上把两侧相同的行移出冲突块,冲突段更紧凑;Git 2.35 起可用,适合大段重复代码的仓库。

冲突期间的 diff 用法

冲突暂停时 git diff 的语义与平时不同:默认显示组合差异;--ours/--theirs 比较工作区与某一侧,-1/-2/-3? 走索引阶段对比。

git rerere 重用冲突解决结果

记录冲突片段及其解决方式,之后再遇到相同冲突自动套用;适合长期维护补丁分支、反复同步上游的团队。

git rebase --rebase-merges 保留合并结构

默认变基会拍平合并提交;--rebase-merges 在重放时重建分支与合并结构,适合整理包含合并的复杂分支。

git commit --squash 生成待合并提交

与 --fixup 类似但保留信息:生成 squash! 前缀提交,autosquash 时折叠到目标提交并打开编辑器合并两条信息。

cherry-pick 拣选一段提交

支持单个提交列表、A..B 区间与 A^..B 写法;按顺序逐个应用,任何一步冲突都会暂停等待处理。

git merge 重命名检测选项

合并时 Git 会尝试识别重命名并跨文件名合并;-X find-renames=<阈值> 调整敏感度,merge.renames 可关闭检测(不推荐)。

git show :1:/:2:/:3: 读取冲突三版本

冲突时索引保存三个版本::1: 共同祖先、:2: 当前分支、:3: 对方;用 git show 可分别查看,配合 diff 精确理解差异。

git rebase --update-refs 同步堆叠分支

变基时同步更新下游分支引用,保持堆叠分支(stacked branches)的父子关系;Git 2.38 起可用。

git cherry-pick -x 记录来源

在生成的提交信息末尾附加 (cherry picked from commit <哈希>) 注记,方便追溯来源,是向维护分支回移补丁时的常见要求。

合并提交信息规范

默认信息形如 Merge branch 'feature/x';支持在信息中补充来源与单号(如 Merge branch 'feature/x' into 'main'、See merge request !42),便于追溯。

git merge 章鱼式合并多分支

一次把多个分支同时并入当前分支(octopus 策略);只在没有冲突时可用,适合发布前批量并入互不重叠的分支。

git merge-tree 预演合并与冲突

不改变工作区即可试算两个分支的合并结果:可只输出冲突信息,也可在对象库中写出合并树,用于 CI 或脚本检查「能否干净合并」。

避免「暗改式」合并提交

合并冲突时常有人顺手夹带无关改动(业内称 evil merge),这类内容不体现在任一方提交里,评审与 bisect 都难以发现。

git merge -s subtree 子目录对齐合并

把对方仓库内容对齐到当前仓库的某个子目录进行合并,用于没有子树元数据的「库中库」场景;新项目更推荐 git subtree 或子模块。

git merge 指定差异算法

冲突块的行对齐方式由差异算法决定;-X diff-algorithm=histogram 或 patience 在重复代码较多的文件上通常更易读。

git checkout --conflict 重做冲突标记

解决过程把文件改乱后可让 Git 重新写入冲突标记:--conflict=merge|diff3|zdiff3 指定样式,等同于按当前样式重新生成。

自定义合并驱动:keep-ours

对版本号、锁文件等总是「保留当前分支」的文件类型,可在 .gitattributes 里绑定自定义 merge 驱动,让合并自动保留本地版本。

git cherry-pick -n 只应用不提交

把拣选的改动写入工作区与索引但不生成提交,便于先修改内容、合并多个提交或重新编写提交信息。

自定义合并驱动:union 并集合并

union 驱动把双方新增行都保留,适合变更日志、清单等「累加式」文本;在 .gitattributes 中对目标文件启用 merge=union。

git rebase --root 从首个提交开始整理

以仓库根为基点重放整段历史,用于整理初始提交(如修正首个提交的信息或合并最初几条提交)。

cherry-pick 合并提交(-m)

合并提交有两个父提交,拣选时必须用 -m 指定以哪个父为主线;-m <父编号> 表示相对该父提交重放此合并引入的差异。

git cherry 对比两条分支的提交

按 patch-id 对比,列出哪些提交已在目标分支有等价改动(以 - 标记)或尚未包含(以 + 标记),辅助判断回移是否已做过。

rerere 自动更新与撤销

rerere.autoUpdate=true 时自动把已记录的解决结果写入索引;也可用 rerere-autoupdate 选项临时控制,配合 rerere forget 纠错。

变基中的空提交与 --empty

重放后内容已被上游包含的提交会变成空提交;用 --empty=drop|keep|stop 控制行为,避免历史里出现无意义空提交或意外停下。

git rerere forget 清理错误记录

当某文件的冲突解决方式被错误记录后,用 rerere forget 删除对应缓存,让下一次冲突回到手工判断。

git rebase --keep-base 复用原合并基础

保持原分支的合并基础不变,只重放本分支提交;用于「上游有新提交但不想改变分叉点」的同步场景。

协作与代码评审75 条

PR/MR 流程、评审规范与提交约定

Conventional Commits 提交规范

给提交信息定结构:<type>[scope]: <description>,正文与页脚用空行分隔;让变更可被工具解析,用于自动生成变更日志与版本号。

评审结论的三种状态

GitHub 支持 Comment(仅评论)、Approve(通过)、Request changes(要求修改);GitLab 对应评论、批准、要求修改(依据版本与设置)。

提交类型(type)常用对照

feat/fix 是规范定义的核心类型,其余 build、chore、ci、docs、style、refactor、perf、test 等来自社区与 Angular 约定,按团队词典统一使用。

gh pr create 创建拉取请求

GitHub CLI 创建 PR:支持指定基分支、标题正文、草稿、评审人;未推送的分支会提示先推送,适合把创建动作放进脚本。

代码评审检查清单

评审先看正确性与安全,再看设计可维护性,最后才是风格细节;用固定清单减少遗漏,也便于新人快速形成评审习惯。

破坏性变更的两种标注

不兼容改动有两种写法:type 或 scope 后加感叹号(feat!、feat(api)!),或在页脚写 BREAKING CHANGE: 描述;两者都可触发主版本号升级。

commitlint 校验提交信息

用 @commitlint/cli 配合 @commitlint/config-conventional 校验提交是否符合约定;本地钩子拦截、CI 全量检查都能用。

PR/MR 描述要素

一份可评审的描述通常包含:变更目的、实现要点、验证方式、影响面与风险、关联单号;写清这些能减少来回追问。

平台合并方式:合并提交 / 压缩 / 变基

GitHub 与 GitLab 都提供多种合并按钮:保留合并提交、squash 合并、rebase 合并;仓库可启用哪些方式属于管理员设置,团队需统一约定。

提交类型到版本号的映射

按规范:fix 对应 PATCH、feat 对应 MINOR、破坏性变更对应 MAJOR;工具据此自动决定下一个发布版本,避免人工拍版本号。

从提交历史生成变更日志

用 git log 按版本区间与提交类型提取条目,快速生成变更日志初稿;配合提交规范可以让分组自动化。

关联与自动关闭 Issue 的关键字

在 PR/MR 描述或提交信息里使用 Closes/Fixes/Resolves 加编号,合并时自动关闭对应 Issue;GitLab 支持 Fixes #、Closes #、Resolves # 等。

请求评审人(reviewers)

创建 PR/MR 时或之后指派评审人:个人、团队/组均可;GitHub 支持 CODEOWNERS 自动请求,GitLab 支持审批规则自动指派。

commit-msg 钩子接入提交校验

在 .git/hooks/commit-msg(或 core.hooksPath 统一目录)里调用校验器,提交信息不合格时直接拒绝提交,把规范前移到本地。

glab mr create 创建合并请求

GitLab CLI 创建 MR:可指定源/目标分支、标题描述、草稿状态、评审人;也支持用 --fill 从提交与分支名生成描述。

CODEOWNERS 语法与位置

CODEOWNERS 文件按路径模式声明负责人:每行「模式 + 所有者」,用 ! 排除路径,后出现的规则优先;GitHub 读取 .github/、根目录或 docs/ 中的该文件。

小批量变更更利于评审

评审质量随 diff 规模下降:几百行以上的一次性审读容易漏问题。把功能拆成可独立合入的小 PR,是提升评审效率的直接手段。

提交页脚与关联信息

页脚用于附加机器可读信息:BREAKING CHANGE、引用 Issue(Refs、Closes)与其他 trailer;token 中的空格用连字符替代。

GitHub 建议修改块(suggestion)

在评论里用 suggestion 代码块给出可直接采纳的替换内容,作者点 Commit suggestion 即可应用,省去手工复制。

Squash 合并的提交信息约定

平台执行 squash 时默认用 PR/MR 标题作提交标题(GitHub 可自定义 Message),正文可包含各条提交摘要与关联单号;标题质量直接影响主干历史。

GPG 提交签名与配置

用 GPG 对提交与标签签名,平台显示 Verified 标识;配置 commit.gpgsign 可自动签名,密钥上传到平台后才显示验证状态。

Conventional scope 范围写法

scope 用括号标注影响范围(模块、包、目录),面向单仓多模块项目尤其有用;范围名建议与目录/包名一致,便于按范围筛选提交。

草稿 PR / Draft MR

未完成的变更先开草稿:GitHub 用 Convert to draft 或 --draft,GitLab 用 Draft: 前缀;草稿状态通常不触发必需评审与合并队列。

GitHub 必需评审与代码所有者评审

受保护分支可要求合并前至少 N 名批准,并可额外要求代码所有者批准;两者叠加时需同时满足。

评审沟通的语气与方式

对事不对人:询问意图、给出依据、提出替代方案;把「你这样不对」换成「这里如果输入为空会怎样?」更容易达成共识。

GitHub 合并队列(merge queue)

高流转仓库用合并队列按序验证待合入 PR:队列为每个 PR 构造临时分支并重跑必需检查,成功后按序合入,避免「各自测试通过、合并后主干失败」。

本地检出 PR 代码做评审

评审复杂改动时在本地检出 PR 分支:运行构建与测试、用熟悉 IDE 看上下文;gh/glab 均提供一条命令检出对应分支。

PR 模板文件(GitHub)

把评审检查项固化为模板:.github/pull_request_template.md 对全部 PR 生效;也可用 .github/PULL_REQUEST_TEMPLATE/ 目录放多个模板按 URL 参数选用。

重新请求评审(re-request review)

按评审意见修改并推送后,点击 Re-request review 或在命令行重新请求,明确告知「有新版本」而不是让对方去猜改动是否完成。

会话解决与会话未解决提示

行内评论形成会话(conversation),处理完成后标记 Resolved;GitHub 可开启合并前必须解决全部会话,GitLab 类似设置按项目配置。

GitLab 审批规则(approval rules)

在项目设置中定义合并请求审批规则:指定审批人数、适用分支、是否重置、是否包含代码所有者,可叠加多条规则。

在评审中标注 nit 与阻塞项

用 nit: 前缀标出不阻塞的小建议,用 must/阻塞 明确合入条件;统一用语能减少「到底要不要改」的反复确认。

GitHub 自动合并(auto-merge)

开启仓库的 Allow auto-merge 后,PR 可在满足全部合并条件时自动合入:适合等待 CI 与审批完成后无需人工点击的场景。

用 gh 查看 PR 状态与检查

命令行巡检 PR:gh pr status 看自己相关的 PR,gh pr checks 看检查结果,gh pr view 看详情;脚本化批量巡检时配合 --json 输出。

DCO:开发者原创声明

DCO(Developer Certificate of Origin)要求每次提交带 Signed-off-by 声明有权提交该代码;许多开源项目用机器人校验,缺失或信息不符会拒绝合入。

评审期间更新 PR 的推送策略

评审期间优先追加提交(保留增量视图),待批准后再整理历史;若必须强推(rebase 同步主干),在 PR 里说明改动范围并请求重新评审。

代码评审中的安全要点

评审时优先看四类高风险面:输入校验与注入、认证授权、密钥与敏感数据处理、依赖引入;发现问题按私下渠道报告而不是公开评论。

revert 提交的写法

回退提交约定用 revert: 前缀,标题引用被回退的提交标题;git revert 默认生成 Revert '...' 信息,可按团队规范调整。

变更日志分组结构

常规做法按「新增 / 修复 / 破坏性变更」分组,必要时补「性能」「文档」「内部」;分组名与提交类型对应,保持长期稳定。

查看「上次评审以来的改动」

评审人复核时只看增量通常更高效:GitHub 有 View changes since last review,GitLab 支持与上一版本对比(Compare with previous version)。

堆叠式 PR(stacked PR)

把大改动拆成一串有先后依赖的 PR,每个都基于前一个分支:评审粒度小、可逐个合入,合并时按顺序从底部向上推进。

Rebase and merge 的行为与限制

GitHub 的 Rebase and merge 把 PR 内提交逐个重放到目标分支(无合并提交);若提交间存在互相冲突的历史,平台会要求先同步分支。

来自 Fork 的 PR 审批与运行策略

外部贡献者通过 Fork 发起 PR 时,工作流可能默认需要维护者批准后才运行,且密钥不注入:这是防滥用设计,不是配置错误。

用 fetch 拉取 PR 的引用

不依赖 CLI 也能取到 PR 代码:GitHub 把 PR 头部暴露为 refs/pull/<编号>/head,按引用拉取即可用于对比或本地复现。

git commit -s 添加签署行

在提交信息尾部追加 Signed-off-by: 作者名 <邮箱>,与 DCO 配套;也可在 merge、revert 等操作时附带签署。

协作署名 Co-authored-by

两人及以上共同完成一次提交时,在提交信息末尾添加 Co-authored-by: 姓名 <邮箱>;平台会把协作作者计入贡献统计(邮箱需匹配账号)。

审批与合入的角色分工

常见约定:评审人负责批准,维护者或作者按仓库规则执行合入;作者自批、无审批合入需要仓库策略支持,并会留下记录。

MR 模板文件(GitLab)

GitLab 使用 .gitlab/merge_request_templates/ 目录存放模板,新建 MR 时从下拉选择;实例级模板可统一组织规范。

GitLab CODEOWNERS 与代码所有者

GitLab 同样支持 CODEOWNERS 文件定义代码所有者,并可将其接入审批规则与受保护分支,实现按目录强制审批。

推送后撤销过时审批

开启「Dismiss stale pull request approvals when new commits are pushed」后,新提交会清空已有批准,确保批准对应的是评审过的代码版本。

把大型 PR 拆成可评审单元

先梳理改动树,再按「可独立合入且可回滚」的边界切分;常见切法:按提交重排拆分、先落接口与开关、机械改动单独一 PR。

MR 流水线(merge request pipelines)

GitLab 为合并请求单独运行流水线:只在 MR 上下文触发,按规则限定在源分支为目标分支的场景,避免每次推送都跑全量分支流水线。

更新分支以符合「须为最新」要求

目标分支前进后,落后分支会因「需与目标分支同步」被阻塞;用 Update branch(合并方式)或 Rebase branch 更新,并在更新后重跑检查。

用 SSH 密钥签名提交

Git 2.34 起支持 gpg.format=ssh:用已有 SSH 密钥签名,配置 allowedSignersFile 做本地验证,平台侧需上传同一公钥并启用。

验证提交签名

本地用 git log --show-signature 或 git verify-commit 检查签名有效性;平台上的 Verified 徽标表示签名密钥已在账号中登记。

批量评审与一次性提交结论

先把零散意见写成待提交评论(GitHub Start a review / Add review comment),全部看完再一次性提交,避免评审人在半成品结论间反复被打断。

PR/MR 标题规范

以 squash 为主的仓库,PR 标题会成为主干提交标题:沿用提交规范(type(scope): 描述),并在 CI 里用规则校验 PR 标题。

GitLab 建议修改(suggestions)

GitLab 行内评论同样支持 suggestion 代码块,作者可 Apply suggestion 或 Apply suggestions 批量应用;应用后提交会记到 MR 里。

CODEOWNERS 匹配优先级

除「后定义优先」外,模式匹配按路径生效;全局 * 兜底时目录级规则要写在后面才能覆盖,团队与个人可混合指定。

必需状态检查与「分支需最新」

要求指定 CI 检查通过才能合并;勾选 Require branches to be up to date 后,分支落后于目标分支时需先更新再合并,避免脏合并。

评审响应节奏与期望管理

评审是协作瓶颈之一:约定响应时限(如工作日内 4 小时给出初步意见)、标注紧急程度、必要时切换同步沟通,能显著缩短合入周期。

GitLab 合并列车(merge trains)

在目标分支要求快进合并且启用合并列车后,多个 MR 按顺序与前一结果组合验证,减少「前一个合并导致后一个失败」的互相等待。

作者(author)与提交者(committer)的区别

作者是写改动的人,提交者是实际执行提交的人;平台按两者分别展示(committed by / authored by),rebase、打补丁等操作会改变提交者。

PR/MR 标签与分流

用标签表达类型、优先级与状态(kind/bug、priority/P1、status/review-needed),支持按标签筛选与自动化:GitHub 可用 labeler 配置按路径自动打标。

用 gh 批量巡检与分流 PR

命令行按作者、标签、状态过滤 PR,输出列表或 JSON,把「谁在等评审、哪些被阻塞」变成一次查询。

git format-patch 生成补丁文件

把提交导出为邮件格式补丁(含作者、提交信息与差异),用于无平台协作的评审、跨网络传递或离线归档。

CONTRIBUTING 贡献指南

在仓库放 CONTRIBUTING.md 说明提交流程:分支命名、提交规范、测试要求、评审与发布节奏;GitHub 会在新建 Issue/PR 时提示查看它。

拉取 GitLab MR 的引用

GitLab 将 MR 头部暴露为 refs/merge-requests/<iid>/head,合并结果位于 refs/merge-requests/<iid>/merge,命令与 GitHub 类似。

评审署名 Reviewed-by

部分平台与项目在合并记录里保留 Reviewed-by trailer(如 GitLab 在 squash/合并时写入批准者),用于追溯由谁完成评审。

新提交重置审批的设置

GitLab 可配置推送新提交时移除已有批准(Reset approvals on push),确保批准对应评审过的版本;关闭它则需要额外的「最后推送人不可批准」类约束。

git am 应用补丁邮件

把 format-patch 生成的补丁(或 .mbox 邮件)应用到当前分支,保留原作者与提交信息;冲突时用 --3way 或手动解决后 --continue。

Issue 分流与模板

用 Issue 模板收集必要信息(版本、复现步骤、日志),用标签与负责人机制分流;明确「需要更多信息」的闭环,避免 Issue 长期悬空。

CLA:贡献者许可协议

部分项目/公司要求贡献者先签署 CLA,授权项目按特定条款使用贡献;通常由机器人检查并在首次 PR 时提示签署流程。

git interpret-trailers 处理页脚

解析与增删提交信息的 trailer(键值页脚):--parse 输出结构化结果,--trailer 追加字段,可用于钩子里自动补充关联信息。

git request-pull 生成拉取请求摘要

为基于 Git 地址的协作生成一段可直接发送的摘要:包含区间提交列表、统计与差异,用于邮件列表或工单中请对方拉取。

进阶与大仓实践69 条

子模块、LFS、稀疏检出与仓库性能

git lfs 安装与大文件跟踪

用 Git LFS 把大文件(模型、素材、二进制包)存到外部存储,仓库里只保留指针;git lfs install 配置钩子,git lfs track 声明模式。

git submodule add 引入子模块

把外部仓库以固定提交的形式嵌入当前仓库:父仓库只记录子模块的 URL、路径与提交指针,子模块内容单独克隆。

git sparse-checkout 稀疏检出

只检出仓库的一部分目录到工作区(锥形模式默认按目录),其余文件仍留在版本库中;大仓开发常与部分克隆搭配使用。

历史改写的风险与收尾清单

重写会改变提交哈希并影响所有克隆、分支、标签与 CI 缓存;收尾至少包含:引用更新、reflog 过期、gc 清理与团队通知。

子模块的初始化与更新

克隆后子模块目录默认是空的:git submodule init 登记配置,git submodule update 检出父仓库记录的提交;也可一步 --init --recursive。

gc 与自动回收参数

git gc 合并包与清理不可达对象;gc.auto 控制自动回收阈值,gc.auto 设为 0 可关闭自动触发,大仓改用 maintenance 计划任务更可控。

git-filter-repo 重写历史

官方文档推荐的仓库历史改写工具(独立脚本):可删除文件、替换文本、按目录拆分;要求尽量在新鲜克隆上操作并复核结果。

大仓日常开发工作流

面向多人共用的单仓:用部分克隆省首次下载、用稀疏检出限定工作目录、用 maintenance 维持性能;提交前注意只影响自己负责的目录。

部分克隆(--filter=blob:none)

克隆时只取提交与树、不取文件内容,检出或读取时再按需下载对应对象;显著降低首次克隆体积,适合大仓与 CI。

commit-graph 加速历史遍历

把提交的父子关系与序号写入图形文件,git log、merge-base 等历史类命令可显著提速;git gc 会顺带生成,也可手动写入与校验。

Git 钩子总览

钩子在提交、推送、合并等关键时刻自动执行:客户端钩子(pre-commit、commit-msg、pre-push 等)与服务端钩子(pre-receive 等)用途不同。

git repack 手动重打包

把松散对象与多个包合并为更少、更紧凑的包;常用 -a -d -b 组合(全量、删除冗余、写位图),大仓可改用 maintenance 的增量重打包。

git worktree 多工作区

同一个仓库同时检出多个工作区:在不同目录并行处理多个分支,共享对象库与配置,省去重复克隆与来回切分支。

仓库体积治理清单

体积治理按「定位 → 归因 → 治理 → 防复发」推进:先找大对象,再决定迁 LFS、移出历史或改为制品管理,最后用规范与检查防止复发。

子模块与子树的选择

子模块保留对方完整仓库与独立历史,适合工具库与可复用组件;子树把代码并入本仓库目录,单仓克隆即可构建,代价是历史合并噪声与更新需要显式命令。

把既有大文件迁移进 LFS

git lfs migrate import 把历史提交中的匹配文件改写为 LFS 指针;先 migrate info 查看候选与体积,再决定是否重写历史。

git maintenance 例行维护

统一的大仓维护入口:注册仓库后按天/小时执行 gc、commit-graph、prefetch、incremental-repack 等任务,替代手工跑 gc。

pre-commit 钩子的典型用法

提交前跑轻量检查:格式化、静态检查、敏感串扫描;原则是快(秒级)且可局部运行,慢检查放 pre-push 或 CI。

替换历史中的文本与凭证

用 --replace-text 按规则文件批量替换历史里的敏感串(如令牌、密钥、内部域名);替换规则支持字面量、正则与整行替换。

git submodule status 查看子模块状态

输出每个子模块当前提交与父仓库记录的差异:前缀 - 表示未初始化、+ 表示提交不一致、U 表示合并冲突,是排查子模块问题的常用入口。

CI 中拉取子模块

流水线默认浅克隆不含子模块:需要 --recurse-submodules 并按需加深历史;私有子模块要在同一凭据体系下可访问,否则构建会卡在拉取。

LFS 的 .gitattributes 条目

track 生成的条目形如 <模式> filter=lfs diff=lfs merge=lfs -text:filter 负责指针转换,diff/merge 走 LFS 专用逻辑,-text 关闭行尾转换。

浅克隆的加深与补全

浅克隆(--depth)只有部分历史:git fetch --deepen=N 追加 N 层,git fetch --unshallow 取回全部历史;需要标签或 blame 时按需补。

定位历史中的大文件

用 rev-list --objects 列出全部对象并交给 cat-file --batch-check 统计大小,是找出「历史里是谁把仓库撑大」的常规手段。

从历史中删除文件或目录

用 --path 指定目标并用 --invert-paths 反选即可删除该路径的全部历史;误提交的大文件、构建产物、内部资料都可通过此方式清理。

GitHub 大文件限制与应对

GitHub 对单文件推送有硬限制:超过 100 MiB 的推送会被拒绝,超过 50 MiB 会给出警告;大文件应改用 Git LFS 或制品库。

CI 浅克隆与按需加深

流水线常以 depth=1 起步:只取最新提交;依赖历史信息(版本号、变更日志、diff 范围)的任务需要显式加深或切换完整克隆。

git submodule foreach 批量操作

对每个子模块执行同一条命令,适合批量拉取、查看状态或统一切换分支;提供 $name、$path、$sha1 等变量。

子模块的提交指针模型

父仓库中的子模块记录的是「子树对象指向某次提交」,不是分支:切换父仓库分支会带着指针变化,理解这点才能正确更新与回滚子模块。

git subtree add 引入子树

把外部仓库内容合并到当前仓库的指定前缀目录;带 --squash 可只保留一次压缩提交,减少历史噪声。

LFS 内容的拉取与按需获取

克隆/拉取时 LFS 会自动下载所需对象;可用 lfs.fetchinclude/exclude 或 --include/--exclude 控制范围,避免一次拉取全部历史大文件。

锥形模式(cone)的行为

cone 模式按目录层级匹配:set 指定目录及其父级目录内容,支持 add/set/reapply;规则简单可预测,是推荐使用的模式。

部分克隆的过滤级别

过滤参数可选 blob:none、blob:limit=<大小>、tree:0:粒度越粗省得越多,但读取时补下载的请求也越多,按使用场景取舍。

multi-pack-index 合并多包索引

为多个 packfile 维护统一索引(MIDX),让对象查找与仓库操作不必逐个扫描包文件;配合 bitmap 还能加速克隆与取回。

fsmonitor 加速状态查询

文件系统监控让 git status 不再全量扫描工作区:新版 Git 内置 FSMonitor(core.fsmonitor=true),在 Windows/macOS 上对大工作区收益明显。

core.hooksPath 统一管理钩子

把钩子目录指向仓库内的 .githooks,使钩子可提交、可评审;New 版本 Git 支持,切换后 .git/hooks 不再生效。

safe.directory 与 dubious ownership

当仓库目录属主与当前用户不一致(容器、sudo、共享目录常见)时,Git 会拒绝操作并提示 dubious ownership;用 safe.directory 显式放行。

gitattributes 进阶属性

除行尾与 LFS 外,属性还能控制差异显示、合并驱动、导出打包与语言统计:diff、merge、export-ignore、export-subst、linguist 等。

历史查询的性能习惯

历史类命令在超大仓库上差异明显:限定范围与路径、避免无界 --all、善用 --first-parent 与提交图形,能显著缩短等待时间。

完整移除一个子模块

顺序:deinit 清工作区 → git rm 移除 gitlink 与 .gitmodules 条目 → 删除 .git/modules/<name> 残留缓存 → 提交变更。

子模块跟踪分支与 --remote 更新

.gitmodules 中可配置 branch 指定子模块应跟踪的分支(默认跟随远端 HEAD),配合 submodule update --remote 拉取该分支并更新指针。

在 CI 中使用 LFS

CI 有两种取舍:不需要大文件内容时跳过下载(省流量提速),需要时确保 lfs 已安装并完成 fetch,否则检出的是指针文本。

稀疏索引(sparse index)

启用后索引只展开稀疏目录的树条目,git status 等命令在超大仓库更快;配合 cone 模式使用,Git 2.34 起趋于稳定。

git verify-pack 检查包内容

逐个对象列出包内类型与体积,用于定位仓库里体积异常的 blob;配合排序快速找到占用空间的对象。

服务端钩子与策略落地

pre-receive、update、post-receive 在服务端仓库执行,无法被客户端绕过,适合做强制策略(拒绝大文件、校验提交格式、触发通知)。

git submodule deinit 反初始化

移除子模块的工作区内容并清理 .git/config 中的配置(保留 .gitmodules 与 gitlink 记录),常用于临时停用某子模块或为删除做准备。

子模块 URL 变更与 sync

.gitmodules 里的 URL 修改后,各克隆的本地配置仍指向旧地址;用 submodule sync 把新 URL 同步到 .git/config 与 .git/modules 配置。

子树的更新与回推

subtree pull 拉取上游更新到前缀目录;subtree push 把本仓库中该目录的提交生成到目标分支,用于把本地改动回馈上游。

git lfs prune 清理本地缓存

删除工作区当前不需要的历史 LFS 对象,回收 .git/lfs 空间;用 --dry-run 先看将删除的清单,再决定执行。

部分克隆的使用注意点

按需拉取让「历史完整、内容不全」成为常态:离线不可用、批量读文件会触发大量请求、某些工具链需要显式预热对象。

工作区的清理与迁移

删除工作区用 remove(--force 处理有改动的目录);需要迁移位置时先 remove 再重新 add,避免留下失效引用。

Windows 长路径支持

Windows 默认路径长度限制会让深层目录检出失败;设置 core.longpaths=true(并确认系统长路径策略)可缓解,主要在嵌套依赖与子模块场景遇到。

reflog 过期与对象清理

reflog 记录引用变动,是误操作的恢复通道;确认不再需要恢复时(如完成历史重写),过期 reflog 并 gc 才能让旧对象真正被回收。

git subtree split 拆分目录历史

把前缀目录的历史提取成一个独立分支(保留相关提交),可用于把目录拆成新仓库或作为回推中间产物。

LFS 文件锁定

对不可合并的大文件(设计稿、模型)使用 lfs lock 加锁,避免两人同时修改;locks 列表与 unlock 用于管理锁状态,需服务端支持。

关闭与调整稀疏检出

git sparse-checkout disable 恢复完整工作区并关闭稀疏模式;调整范围用 set/list,无需退出稀疏状态即可切换关注的目录。

promisor 远端与按需对象补齐

部分克隆会把远端登记为 promisor(承诺可补齐对象);缺对象时 Git 自动从那拉取,理解它才能解释离线报错与补齐行为。

untracked cache 减少目录扫描

把「哪些目录确认没有未跟踪文件」记入索引,让 git status 少扫目录;在文件数多的仓库上对状态命令有直接收益。

git filter-branch 及其替代

旧式历史重写工具:用法复杂、速度慢,官方文档已建议改用 git filter-repo 等工具;存量脚本迁移时注意行为差异。

core.fileMode 与权限位

Git 记录可执行位:core.fileMode 控制是否跟踪文件模式变化;Windows 或跨文件系统挂载时该值常被自动置为 false,避免假性模式差异。

GitLab 仓库 Housekeeping

GitLab 会在推送后自动执行仓库整理(gc、repack 等)以控制体积;管理员也可在项目或实例层面手动触发,排查体积异常时先确认整理是否完成。

git submodule absorbgitdirs 收纳目录

把子模块目录内的 .git(文件或目录)迁移进父仓库的 .git/modules 统一管理,保持子模块目录干净、便于统一备份与迁移。

git lfs env 查看环境与端点

输出 LFS 端点、本地缓存目录与版本等诊断信息,用于排查「推到哪个存储、缓存占多少空间、配置是否被覆盖」。

feature.manyFiles 一键大仓配置

开启对大文件数仓库更合适的索引选项(如索引版本 4、未跟踪缓存等),减少逐项调参成本;可用 git config --show-origin 复核结果。

git notes 附加提交注解

在不修改提交内容的前提下给提交挂注解(评审结论、CI 结果、迁移标记);注解存放在独立引用空间,默认不随 push 同步。

Trace2 诊断 Git 命令性能

用 GIT_TRACE2_PERF 记录命令内部耗时,定位是网络、索引还是磁盘导致慢;诊断完记得关闭,避免日志影响正常使用。

pack-refs 合并松散引用

分支与标签数量多时,松散引用文件会让引用遍历变慢:git pack-refs --all --prune 把引用打包进 packed-refs,是低风险的基础维护。

git diagnose 收集仓库诊断

一键收集仓库状态、配置与对象库摘要并打包,用于上报疑难问题;输出文件可能包含路径与配置,对外分享前先检查。

Scalar 一键大仓配置

Scalar(Git 自 2.38 起随附)为大仓提供推荐配置:克隆时启用部分克隆、稀疏检出与维护计划,减少手工调参。

没有匹配的条目。换个关键词试试,或直接全站搜索。
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌