Skip to content
Chapter 09

高级场景

bisect 二分定位 bug、blame 追踪代码作者、子模块、Git LFS、cherry-pick 进阶、filter-repo 清理历史,以及 Hook 与 .gitattributes。

排查与追踪

git bisect 是什么?怎么用?
用二分法定位引入 bug 的 commit。
流程:git bisect start → git bisect bad HEAD(标记当前有 bug)→ git bisect good <旧commit>(标记某个旧版本正常)→ Git 自动 checkout 中间的 commit,你逐个标记 git bisect good 或 git bisect bad,直到精确定位。
找到后执行 git bisect reset 回到原分支。
git blame 能做什么?
追踪每行代码是谁在哪个 commit 写的:git blame file.js
输出每行的 commit hash、作者、时间。适合排查"这行代码是谁写的、什么时候引入的"。
小技巧
git blame -L 10,30 file.js 只查看第 10~30 行的 blame 信息,范围更精确。
bisect & blame 练习
Welcome to bisect & blame 练习终端
输入 help 查看可用命令,或按「自动演示」按钮
~/project $

子模块与大文件

什么是 Git Submodule?
在仓库内引用另一个独立仓库:git submodule add <url> <path>
主仓库只保存子模块的 commit 指针,不会复制子模块的全部文件。
克隆含子模块的仓库时需要 git clone --recurse-submodules <url>,否则子模块目录为空。
Git LFS 是什么?
Large File Storage — 用指针文件替代大文件(图片、视频、模型等)存储在 Git 中。
使用流程:git lfs install → git lfs track "*.psd"(会在 .gitattributes 中记录追踪规则)→ 之后正常 git add / commit / push,LFS 自动处理大文件的上传与下载。
注意
Git LFS 需要远端服务器支持(GitHub / GitLab 均支持)。团队所有人必须安装 LFS 客户端,否则无法正确拉取大文件。
cherry-pick 进阶用法?
跨分支移植特定 commit:git cherry-pick <hash>
可连续 cherry-pick 多个:git cherry-pick abc123 def456
也可用范围:git cherry-pick abc123^..def456(左开右闭区间)。
遇到冲突时解决后 git cherry-pick --continue,或放弃用 git cherry-pick --abort。
filter-branch / filter-repo 是什么?
用于清理历史中的敏感信息(密码、密钥)或误提交的大文件。
git filter-branch 是旧方式,速度慢且已不推荐。
推荐使用 git filter-repo(需单独安装 pip install git-filter-repo),更快更安全。
重要提醒
filter-repo 会重写 commit 历史,已推送的仓库需要 git push --force。团队协作时务必提前沟通,确保所有人同步。

Hook 与属性

什么是 Git Hook?
Git 事件触发的自定义脚本,存放在 .git/hooks/ 目录下。常用 Hook:
pre-commit — 提交前检查(lint、格式化)
pre-push — 推送前运行测试
commit-msg — 校验提交消息格式(如 Conventional Commits)
post-merge — 合并后自动执行操作(如 npm install)
.gitattributes 能做什么?
文件级别的属性配置,可指定:
diff 算法 — *.c diff=histogram
合并策略 — package-lock.json merge=ours
换行符处理 — *.txt text eol=lf
LFS 追踪 — *.psd filter=lfs diff=lfs merge=lfs -text
推荐实践
团队项目建议用 husky + lint-staged 管理 Git Hook,配置写在 package.json 中,随仓库同步,不需要手动复制脚本到 .git/hooks/。
Git Hook 体验
Welcome to Git Hook 体验终端
输入 help 查看可用命令,或按「自动演示」按钮
~/project $