综合 Git 2.51 发布:switch/restore 转正,MIDX 瘦身 38%,stash 能当 ref 传了

2026-09-17 21:02:09

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 switchgit restore 不再标记为实验性,正式稳定。这两个命令从 2.23 起就在做 git checkout 的清晰替代,现在可以放心写进脚本和文档,不用再顾虑「实验特性」标签。

git stash 引入了 stash 条目交换格式,新增 git stash import / git stash export 子命令。stash 现在能作为一个 ref,像分支、标签一样 push/pull 传输,跨机器、跨仓库迁移 stash 有了正规路径,不必再手工打补丁搬运。

git pull 学会了 pull.autostash 配置,优先级高于 rebase.autostashmerge.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 会检测彼此重叠的远端名,比如 outerouter/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 做一轮兼容性测试,再决定后续迁移节奏。

复制全文 生成海报 Git 版本控制 reftable SHA256

推荐文章

程序员茄子在线接单