Git 是程序员最常用的版本控制工具,用来记录代码的每一次改动:谁改的、改了什么、什么时候改的都能查,团队协作靠它把各自的分支合并到一起。2026 年 6 月 29 日,Git 官方发布了 2.55 版本,由超过 100 位贡献者完成,其中 33 位是第一次参与。这一版的主线是让大仓库更好维护:官方推荐的增量多包索引(MIDX)写法变得更直接,内置的文件系统监视器(fsmonitor)补上了 Linux 支持,配置化的钩子(hooks)可以并行执行。如果你维护的仓库体量很大,或者在 Linux 上觉得 git status 很慢,这一版值得立即升级。
增量 MIDX:大仓库维护的推荐做法
Git 把文件内容存成一个个「对象」,再压缩打包成 packfile(打包文件)。仓库变大后 packfile 越来越多,Git 查找对象时就要挨个翻包。多包索引(MIDX,Multi-Pack Index)相当于给所有 packfile 建一份统一目录,让 Git 一次定位对象在哪个包里。
Git 2.47 引入了增量 MIDX:把这份索引存成一条「层链」,新增数据只往链尾追加一层,不必重写覆盖全部仓库的整份索引。Git 2.55 让 git repack 可以直接写出这种增量结构:
git repack --write-midx=incremental
单独执行时它是只追加模式:只给新生成的包加一层索引,旧层完全不动。与几何打包组合使用时,可以自动整理层链:
git repack --write-midx=incremental --geometric=2 -d
Git 先追加新层,再判断相邻层是否需要合并:新层积累的对象数量达到阈值时,把相邻层压成一层;合并是纯元数据操作,不会重新打包对象。这样层数保持在对数级别增长,日常维护只改增量部分,不用每次重写整个仓库的索引。合并比例和触发阈值分别由 repack.midxSplitFactor、repack.midxNewLayerThreshold 两个配置项控制。
git history fixup:把改动并进更早的提交
改代码时常遇到这种情况:改到一半发现某处修改应该属于三个提交之前的那个提交。老办法要先建一个 fixup 提交,再做一次变基(rebase,重新排列提交)让它自动合并,步骤绕,还要背两条命令。Git 2.55 在实验命令 git history 里新增了 fixup 子命令:
git history fixup <commit>
它把暂存区(已经准备好要提交的改动)里的内容直接并入指定的早期提交,后面的提交自动重放在新历史之上。默认保留目标提交的说明文字和作者,想改说明就加 --reedit-message。这个命令仍是实验性的,遇到冲突会直接中止,不会把你留在改了一半的状态里。
内置 fsmonitor 支持 Linux
git status 慢,通常是因为它要扫描整个工作目录来确认哪些文件变了。Git 的内置文件系统监视器(fsmonitor,常驻后台的守护进程)会记录文件变化,让 git status 直接问它「哪些路径变了」,不用全盘扫描。这个功能此前只支持 macOS 和 Windows,Git 2.55 补上了 Linux 支持,基于内核的 inotify 机制,不需要提权。超大仓库可能要把 fs.inotify.max_user_watches 调大;网络挂载的仓库仍需要手动开启。
配置化 hooks 允许并行
Git 2.54 允许把钩子(hooks,Git 在提交、推送等时机自动运行的脚本)写进配置文件,而不是散落在每个仓库的 hooks 目录里。2.55 进一步让互相独立的钩子并发执行:钩子声明 hook.<name>.parallel=true 后,Git 就可以同时跑多个。并发数可以全局(hook.jobs)、按事件(hook.<event>.jobs)或命令行(git hook run -j)控制。需要共享状态的钩子,比如检查暂存区的 commit-msg 类钩子,仍按顺序执行。
其余值得留意的更新
位图生成提速。 Git 用位图(bitmap,记录哪些对象可达的比特数组)加速对象遍历,而生成位图曾经是大仓库维护的耗时环节。2.55 优化后,某个大仓库的位图生成时间从约 612 秒降到约 294 秒;pseudo-merge 位图在保留遍历加速的同时,也把生成开销压了下来。
打包更小。 --path-walk(按路径分组做二次压缩)现在能和多种过滤器组合使用。官方在 Git 自己的仓库上做 blob-less 打包测试,体积约小 16%。
新实验命令 git format-rev。 从标准输入读取提交并格式化输出,适合在钩子和脚本里做「把提交名字换成作者名」这类处理,不必为每个提交单独启动一个 Git 进程。
更安全的推送输出。 网络传输的进度消息默认掩蔽终端控制字符,防止恶意服务器向你的终端注入控制序列;ANSI 颜色输出仍保留。
git checkout -m 更稳。 切换分支遇到冲突时,本地改动先存成储藏条目(stash),可以立即处理,也可以稍后恢复。
git push 支持远程组。 配置 remotes.<name> 后,一条 git push publish main 可以依次推送到 github、gitlab、mirror 等多个远程;--atomic 原子推送不支持。
日志小工具。 git log --graph 新增 --graph-lane-limit=<n>,分支线太多时用 ~ 代替超出的车道;git log / git rev-list 新增 --max-count-oldest=<n>,直接取范围内最旧的 n 个提交,不用先反转整个历史。
升级后可以先试这三件事
- 大仓库维护:跑
git repack --write-midx=incremental --geometric=2 -d,让索引维护只动增量层。 - Linux 提速:开启 fsmonitor,感受
git status的变化。 - 改历史:用
git history fixup <commit>,把暂存区改动并进它该去的那个提交。
Git 2.55 没有革命性的新功能,但把大仓库日常维护的各个瓶颈都往前推了一步。对维护大型仓库的团队和 Linux 用户来说,这是一次值得安排的升级。