Skip to content

Git 2.46~2.55 的实用更新

· 8 min
TL;DR

上篇《Git 最近的一些有用的更新》写到了 Git 2.45。这篇继续,梳理 2.46 到 2.55 之间,日常写代码真会撞上的十五个「命令/配置」改进,分两块:日常命令(切分支怕丢改动、stash pop 丢暂存区、git config 难记、合并总结太长、打错命令名、脚本被 advice 刷屏)和排查协作last-modified 查归属、blame 修移动代码、range-diff 补全 merge、图谱超宽、一次推多远端、stash 跨机器、标签落款、大仓库提速)。

日常命令#

1. 切分支怕丢改动:checkout -m 自动 stash#

场景很常见:工作区有未提交的改动,想切到另一个分支。只要两边改的文件路径有重叠,就可能冲突。

以前 git checkout -m another-branch 处理这种冲突是「一锤子买卖」——只给你一次解决冲突的机会,没处理好本地改动就悬了。从 2.55.0 开始,这个命令会在处理前自动把本地改动先存成一个 stash,等于多了个后悔药:

Terminal window
$ git checkout -m another-branch

冲突解决砸了也不慌,改动还在 stash 里躺着,随时能捞回来。

2. stash pop 老丢暂存区:stash.index 配置#

git stash 存的时候默认会记录暂存区状态,但 git stash pop 恢复时默认不恢复暂存区,得手动加 --index。忘了加,暂存区状态就没了,还得重新 git add

2.52.0 起可以直接配置,让 pop/apply 默认就带上 --index 的效果:

Terminal window
$ git config stash.index true

以后 git stash pop 直接连暂存区一起恢复,再也不用记那个 --index

3. 加备注只能 -m 塞:notes add -e#

给某个 commit 加备注(notes),以前得 git notes add -m "..." 把整段文字塞命令行里,写个长一点的说明特别憋屈。

2.48.0 起加了 -e

Terminal window
$ git notes add -e <commit>

直接在 $GIT_EDITOR 里舒舒服服写,写完保存就挂上了。

4. git config 子命令化#

git config 大概是最高频的配置命令,但长久以来的写法是「选项式」:git config --get user.namegit config --add alias.co checkout。选项多、可读性差、补全也难做准。

2.46.0 起改成子命令,更直观:

Terminal window
$ git config get user.name
$ git config set user.name "Alice"
$ git config list

旧写法(--get/--set)还在,只是标记 deprecate,但新脚本建议直接换子命令版。

5. 合并总结太长:—compact-summary#

git mergegit pull 完,那个 diffstat 总结经常又长又啰嗦,改动一多就刷屏。2.51.0 给了紧凑版:

Terminal window
$ git merge --compact-summary
$ git pull --compact-summary

new/gone/+x(新增/删除/权限变化)这类紧凑标记代替完整 diffstat,一眼看清合并带来了什么。

6. 打错命令名自动纠正:help.autocorrect#

手滑敲成 git stauts 这种,git 会提示「是不是想说 status」,但默认只是提示、不执行。2.49.0 起 help.autocorrect=1 的语义变了——有唯一纠错就立即执行,不再等:

Terminal window
$ git config help.autocorrect 1
$ git stauts # 直接帮你执行 git status

注意:这是双刃剑。如果某个错误拼写恰好只匹配一个命令,它会直接跑。脚本里别开。

7. 脚本输出被 advice 刷屏:—no-advice#

git 那些「温馨提示」(advice)对交互用户有用,但脚本/CI 里全是噪音。2.46.0 加了全局开关,一条命令全静默:

Terminal window
$ git --no-advice status

写脚本、做自动化时很好用,省得 2>/dev/null 连真正的报错一起吞了。

排查与协作#

8. 这文件最近谁动的:git last-modified#

想知道某个文件(甚至整个目录每个文件)最近被哪个 commit 改过,以前要么翻 git log -- <path> 人肉找,要么写脚本遍历。2.52.0 直接给了条命令:

Terminal window
$ git last-modified -- src/foo.c
$ git last-modified -- src/ # 目录也行,逐个文件列

它显示每个路径「最近一次触碰它的祖先提交」,排查「这块代码最近谁动过」一步到位。

9. blame 移动代码归属错乱:—diff-algorithm#

git blame 遇到「代码从别处搬过来」的情况,经常把行归属标错(标成搬动它的那次提交,而不是最初写的提交)。2.53.0 起可以指定 diff 算法改善这个:

Terminal window
$ git blame --diff-algorithm=histogram file.c

换 histogram(或 patience)算法后,移动代码的归属判断更准,blame 出来的结果更可信。

10. 审查含 merge 的 PR:range-diff —diff-merges#

git range-diff 是比对新旧两个提交序列的神器,但默认跳过 merge 提交。审查「含 merge 的 PR 改版」时就会漏掉关键信息。2.48.0 补上了:

Terminal window
$ git range-diff --diff-merges=remerge A...B C...D

现在 merge 提交也参与对比,改版前后的差异看得更全。

11. 多分支图谱超宽:—graph-lane-limit#

分支一多,git log --graph 的输出横向能铺到屏幕外,根本没法看。2.55.0 加了泳道限制:

Terminal window
$ git log --graph --graph-lane-limit=10

超过 10 条泳道就不再无限展开,图谱一下清爽了。

12. 一次推多个远端:git push <group>#

git fetch 早就能用一个组名一次 fetch 多个远端,但 git push 一直只能一次推一个。要同时推到 GitHub 和公司内网 GitLab,得推两遍。

2.55.0 补齐了:

Terminal window
$ git config --add remotes.all origin
$ git config --add remotes.all upstream
$ git push all # 一次推多处

和 fetch 对齐了,多远端同步少敲一半命令。

13. 半成品改动跨机器:stash export / import#

stash 一直「窝」在本地仓库里,换台机器、换个仓库就带不走。2.51.0 加了可交换格式:

Terminal window
$ git stash export > stash.txt
# 到另一台机器 / 另一个仓库
$ git stash import < stash.txt

没做完的改动打包带走继续写,比手动 git diff 存文件可靠得多。

14. release 标签落款:git tag —trailer#

git commit 早能操作 trailer(Signed-off-by 那类),但打 release 标签时想加个责任人落款,以前没地儿加。

2.46.0 起 git tag 也支持:

Terminal window
$ git tag -a v1.0.0 --trailer "Signed-off-by: Alice <[email protected]>"

CI 里打 release 标签顺手带签名/责任人,规范化落款不再缺一块。

15. 大仓库 status 慢:core.fsmonitor#

fsmonitor 守护进程能让 git 记住文件系统变化,git status 不用全仓库扫一遍。以前这个福利主要在 macOS/Windows,Linux 用户只能干瞪眼。

2.55.0 终于落地 Linux:

Terminal window
$ git config core.fsmonitor true

大仓库(尤其 monorepo)的 git status 直接起飞。仓库越大,感知越明显。


本文由 DeepSeek-v4-flash 整理