第 3 卷
- 配置优化:调整Git默认参数
◦ 开启压缩:提升网络传输效率(默认开启,可确认配置):
Code block
1git config --global core.compression 9# 压缩级别1-9,9为最高压缩
◦ 关闭文件索引统计:对于海量文件仓库,关闭 git status 时的文件统计,提升速度:
Code block
1git config --global core.stat false
◦ 增大缓存:调整Git的内存缓存大小,减少磁盘IO:
Code block
1git config --global core.deltaBaseCacheLimit 1g# 缓存大小设为1G,根据内存调整
- 仓库结构优化
◦ 使用Git子模块(git submodule):将大型仓库拆分为多个独立子仓库,主仓库仅引用子仓库
的版本,避免单个仓库体积过大;
◦ 使用Git LFS(Large File Storage):专门管理大文件(如图片、视频、二进制包等),不将大
文件存储在Git普通仓库中,而是通过指针引用,减少仓库体积和操作耗时;
◦ 清理无用数据:定期清理悬空提交、过期分支、大文件历史等,缩小仓库体积:
Code block
| 1 | git gc | #垃圾回收,整理仓库数据,优化存储 |
|---|---|---|
| 2 | git filter-repo | #彻底删除历史中的大文件(比git filter-branch更高效) |
- 日常操作优化
◦ 避免频繁操作全量历史:使用 git log --oneline --no-merges 等简洁命令查看历
史,减少数据加载;
- 本地分支及时清理:删除已合并的本地分支,减少Git分支遍历的开销;
◦ 使用稀疏检出(Sparse Checkout):仅检出工作区需要的目录,不下载所有文件,适用于仅
九、Git内部工作原理与文件变化跟踪机制
Git的核心设计是内容寻址文件系统,其内部不直接跟踪“文件变化”,而是跟踪“文件内容的快照”,具体工作原理如下:
- Git的核心数据结构(底层支撑)
Git本地仓库的核心数据存储在 .git 目录下,关键数据结构有3种,构成了Git的底层基础:
◦ Blob对象(二进制大对象):用于存储文件的内容数据,不包含文件名和目录结构,仅通过内
容的哈希值(SHA-1)唯一标识(相同内容的文件对应同一个Blob对象,实现数据去重);
◦ Tree对象:用于描述目录结构,存储了目录下的文件名、对应Blob对象/子Tree对象的哈希值,
以及文件权限,同样通过SHA-1唯一标识;
◦ Commit对象:用于记录一次提交的完整信息,包括:指向当前版本Tree对象的哈希值(对应
本次提交的工作区快照)、父提交对象的哈希值(形成提交历史链)、提交者信息、提交时间、提交说明,通过SHA-1唯一标识。
- Git跟踪文件变化的核心机制(快照式跟踪)
Git与SVN(跟踪文件行级变化)的核心区别是:Git不跟踪文件的增量变化,而是在每次提交时,生成当前工作区所有文件的完整快照,并记录快照之间的关联关系,具体流程如下:
- 工作区 → 暂存区:执行 git add 时,Git会计算每个文件内容的SHA-1哈希值,生成Blob对
象(若文件内容未变,则直接复用已有Blob对象),然后更新暂存区(索引),暂存区本质是一个“待提交快照的清单”,记录了文件名、Blob对象哈希值、文件权限等信息;
- 暂存区 → 本地仓库:执行 git commit 时,Git会根据暂存区的清单,生成Tree对象(描述
目录结构),再生成Commit对象(关联Tree对象、父Commit对象等信息),最后将Blob、 Tree、Commit对象持久化到 .git/objects 目录下(以哈希值为文件名存储);
- 版本回溯与差异计算:当需要查看不同版本的文件差异时,Git并非直接存储差异,而是通过两
个版本对应的Commit对象,找到各自的Tree对象和Blob对象,对比Blob对象的内容,计算出文件的变化(即“快照对比”);
- 轻量级分支与历史跟踪:Git的分支本质是一个指向Commit对象的可移动指针,每次提交时,
分支指针自动指向新的Commit对象;通过Commit对象的父指针,Git可以追溯整个版本历史,从而实现对文件变化的完整跟踪。
- 总结
Git的核心工作逻辑是:以内容哈希(SHA-1)为唯一标识,通过Blob、Tree、Commit对象构建快照,以暂存区为桥梁,将工作区的变更转化为仓库中的快照记录,最终通过Commit对象的父子关联
- 分支冲突需手动编辑冲突文件、标记解决、完成合并,rebase(线性历史)与merge(保留分叉)
各有适用场景;
- git pull = git fetch + git merge,前者便捷但有风险,后者安全更灵活;
- Git钩子是自动化脚本,用于校验代码、触发部署等;撤销最后一次提交分“保留修改”和“丢弃修
改”两种方案;
- 大型仓库优化可从克隆、配置、结构、日常操作入手;Git通过快照式存储(Blob/Tree/Commit)
实现文件变化跟踪,而非增量跟踪。
(注:文档部分内容可能由 AI 生成)
全站分卷索引 · 3 卷
- 1第 1 卷
- Git 中 Pull、Fetch、Merge 和 Rebase 的差异
- 解析
- 一、Git与SVN的本质区别
- ◦ Git:分布式版本控制系统(DVCS)。每个开发者本地都会完整克隆整个仓库的所有版本历
- ◦ SVN:集中式版本控制系统(CVCS)。所有版本历史、分支信息都存储在唯一的中央服务器
- ◦ 离线工作能力:Git支持完全离线工作(本地提交、版本对比等),SVN无网络无法进行版本相
- ◦ 分支/标签效率:Git的分支/标签是轻量级的(仅指向特定提交的指针),创建、切换、合并几
- ◦ 数据安全性:Git本地仓库完整备份,单个仓库损坏可通过其他开发者的本地仓库恢复;SVN中
- 二、开发中常用的Git命令
- ◦ git status:查看工作区、暂存区的文件状态(哪些文件未跟踪、已修改未暂存、已暂存
- ◦ git commit --amend:修改最近一次提交的说明(或补充暂存区的修改到最近一次提
- ◦ git checkout -- <文件名>:撤销工作区中该文件的未暂存修改(恢复到暂存区或最近
- 2第 2 卷
- ◦ git merge:提交历史是非线性的,会保留分支的分叉记录(可清晰看到何时创建分支、何
- ◦ git rebase:提交历史是线性的,会“抹平”分支分叉,看起来当前分支是在目标分支最
- ◦ git merge:适合**公共分支(如master/main、develop)**的合并,保留完整的分支历
- ◦ git rebase:适合**个人分支/功能分支(如feature/*)**整合公共分支更新,或在合并到
- ◦ 变基(rebase):分支A → 基于分支B最新版本变基 → 分支A的提交依次排在B最新提交之后
- 五、git pull 与 git fetch 的区别
- ◦ git fetch:仅拉取,不合并。将远程仓库的最新提交、分支信息拉取到本地的远程跟踪分
- ◦ git pull:拉取 + 自动合并。 git pull 本质上是 git fetch + git merge(默
- ◦ git fetch:更安全、更灵活。由于不自动合并,开发者可以通过 git diff <本地分支
- ◦ git pull:更便捷,但灵活性低、风险略高。适合本地分支无未提交修改、且确认远程更新
- ◦ git pull:适合个人开发分支快速同步远程更新(如个人feature分支拉取远程develop分
- 六、Git钩子(hook)的定义与用途
- 3第 3 卷
- ◦ 开启压缩:提升网络传输效率(默认开启,可确认配置):
- ◦ 关闭文件索引统计:对于海量文件仓库,关闭 git status 时的文件统计,提升速度:
- ◦ 增大缓存:调整Git的内存缓存大小,减少磁盘IO:
- ◦ 使用Git子模块(git submodule):将大型仓库拆分为多个独立子仓库,主仓库仅引用子仓库
- ◦ 使用Git LFS(Large File Storage):专门管理大文件(如图片、视频、二进制包等),不将大
- ◦ 清理无用数据:定期清理悬空提交、过期分支、大文件历史等,缩小仓库体积:
- ◦ 避免频繁操作全量历史:使用 git log --oneline --no-merges 等简洁命令查看历
- ◦ 使用稀疏检出(Sparse Checkout):仅检出工作区需要的目录,不下载所有文件,适用于仅
- 九、Git内部工作原理与文件变化跟踪机制
- ◦ Blob对象(二进制大对象):用于存储文件的内容数据,不包含文件名和目录结构,仅通过内
- ◦ Tree对象:用于描述目录结构,存储了目录下的文件名、对应Blob对象/子Tree对象的哈希值,
- ◦ Commit对象:用于记录一次提交的完整信息,包括:指向当前版本Tree对象的哈希值(对应