Git 2.51 发布:switch/restore 转正,MIDX 瘦身 38%,stash 能当 ref 传了
Git 2.51 于 2025-08-18 发布。本版共 91 位贡献者,其中 21 位是首次参与。
- Release Notes:https://github.com/git/git/blob/HEAD/Documentation/RelNotes/2.51.0.adoc
- 仓库:https://github.com/git/git
UI 与工作流
git switch 和 git restore 不再标记为实验性,正式稳定。这两个命令从 2.23 起就在做 git checkout 的清晰替代,现在可以放心写进脚本和文档,不用再顾虑「实验特性」标签。
git stash 引入了 stash 条目交换格式,新增 git stash import / git stash export 子命令。stash 现在能作为一个 ref,像分支、标签一样 push/pull 传输,跨机器、跨仓库迁移 stash 有了正规路径,不必再手工打补丁搬运。
git pull 学会了 pull.autostash 配置,优先级高于 rebase.autostash 和 merge.autostash:
[pull]
autostash = true
git merge / git pull 新增 --compact-summary,用紧凑摘要替代 diffstat 展示引入的变更。
对象检查方面,git cat-file --batch 新增 %(objectmode) atom,可以区分「对象缺失(仓库损坏)」和「子模块(commit 对象缺失属正常)」这两种情况;--batch-check 对子模块路径报告的是 submodule,而非 missing。
其他零散改动:
git diff --no-index dirA dirB支持在命令行末尾追加 pathspec 限定比较范围。git for-each-ref新增--start-after,便于分页。- contrib 里的
git subtree支持用 GPG 签名它产生的提交。 git remote会检测彼此重叠的远端名,比如outer与outer/inner同时存在。git whatchanged计划在 Git 3.0 弃用并移除,过渡期仍可用--i-still-use-this强制启用。git imap-send复活,支持 OAuth2.0 等认证方式,--list带有示例。gpg.program支持~展开;netrc helper 支持文本服务名(如smtp),不再只认端口号;git add -p等交互命令遵循diff.context与-U。- 放开
git log的 changed-path filter 限制,可用于含多个字面路径的 pathspec。
性能与内部
repack.MIDXMustContainCruft 让多包索引 MIDX 只包含可达对象,剔除 cruft pack。GitHub monorepo 的实测数据:MIDX 大小缩小约 38%,生成速度提升约 35%,读取性能提升约 5%。
[repack]
MIDXMustContainCruft = false
新的 --path-walk 重打包模式按路径分组对象后一起发出,不再依赖 name-hash 启发式。包通常更精简,同一路径下对象的 delta 机会更好,耗时与传统遍历相当或更优。
此外还有一批修复:git fetch --prune 在多引用场景下的 O(n²) 性能问题、push/fetch 通过批量更新引用提速、以及大量内存泄漏。
迈向 Git 3.0:reftable 与 SHA-256
计划把 reftable 作为新仓库的默认引用后端,用来解决引用名大小写/Unicode 缺陷,并提供原子引用事务、几何压缩与前缀压缩。同时计划把默认哈希从 SHA-1 切到 SHA-256。想预览这些改动,可以用 WITH_BREAKING_CHANGES 构建。
现实影响很直接:任何假设对象 ID 是 40 字符 SHA-1、或按长度解析对象 ID 的脚本、CI、托管工具都会失效;钩子、签名标签、部署清单需要接受更长的哈希;镜像和托管工具需要 reftable 支持。
目前新仓库默认仍是 SHA-1,这是一条可选的过渡路径,不是强制切换。稳妥做法是先在 CI 镜像里跑 2.51+,用 2.51 的 Git 做一轮兼容性测试,再决定后续迁移节奏。