上篇《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,等于多了个后悔药:
$ 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 的效果:
$ git config stash.index true以后 git stash pop 直接连暂存区一起恢复,再也不用记那个 --index。
3. 加备注只能 -m 塞:notes add -e#
给某个 commit 加备注(notes),以前得 git notes add -m "..." 把整段文字塞命令行里,写个长一点的说明特别憋屈。
2.48.0 起加了 -e:
$ git notes add -e <commit>直接在 $GIT_EDITOR 里舒舒服服写,写完保存就挂上了。
4. git config 子命令化#
git config 大概是最高频的配置命令,但长久以来的写法是「选项式」:git config --get user.name、git config --add alias.co checkout。选项多、可读性差、补全也难做准。
2.46.0 起改成子命令,更直观:
$ git config get user.name$ git config set user.name "Alice"$ git config list旧写法(--get/--set)还在,只是标记 deprecate,但新脚本建议直接换子命令版。
5. 合并总结太长:—compact-summary#
git merge 或 git pull 完,那个 diffstat 总结经常又长又啰嗦,改动一多就刷屏。2.51.0 给了紧凑版:
$ 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 的语义变了——有唯一纠错就立即执行,不再等:
$ git config help.autocorrect 1$ git stauts # 直接帮你执行 git status注意:这是双刃剑。如果某个错误拼写恰好只匹配一个命令,它会直接跑。脚本里别开。
7. 脚本输出被 advice 刷屏:—no-advice#
git 那些「温馨提示」(advice)对交互用户有用,但脚本/CI 里全是噪音。2.46.0 加了全局开关,一条命令全静默:
$ git --no-advice status写脚本、做自动化时很好用,省得 2>/dev/null 连真正的报错一起吞了。
排查与协作#
8. 这文件最近谁动的:git last-modified#
想知道某个文件(甚至整个目录每个文件)最近被哪个 commit 改过,以前要么翻 git log -- <path> 人肉找,要么写脚本遍历。2.52.0 直接给了条命令:
$ git last-modified -- src/foo.c$ git last-modified -- src/ # 目录也行,逐个文件列它显示每个路径「最近一次触碰它的祖先提交」,排查「这块代码最近谁动过」一步到位。
9. blame 移动代码归属错乱:—diff-algorithm#
git blame 遇到「代码从别处搬过来」的情况,经常把行归属标错(标成搬动它的那次提交,而不是最初写的提交)。2.53.0 起可以指定 diff 算法改善这个:
$ 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 补上了:
$ git range-diff --diff-merges=remerge A...B C...D现在 merge 提交也参与对比,改版前后的差异看得更全。
11. 多分支图谱超宽:—graph-lane-limit#
分支一多,git log --graph 的输出横向能铺到屏幕外,根本没法看。2.55.0 加了泳道限制:
$ git log --graph --graph-lane-limit=10超过 10 条泳道就不再无限展开,图谱一下清爽了。
12. 一次推多个远端:git push <group>#
git fetch 早就能用一个组名一次 fetch 多个远端,但 git push 一直只能一次推一个。要同时推到 GitHub 和公司内网 GitLab,得推两遍。
2.55.0 补齐了:
$ git config --add remotes.all origin$ git config --add remotes.all upstream$ git push all # 一次推多处和 fetch 对齐了,多远端同步少敲一半命令。
13. 半成品改动跨机器:stash export / import#
stash 一直「窝」在本地仓库里,换台机器、换个仓库就带不走。2.51.0 加了可交换格式:
$ 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 也支持:
CI 里打 release 标签顺手带签名/责任人,规范化落款不再缺一块。
15. 大仓库 status 慢:core.fsmonitor#
fsmonitor 守护进程能让 git 记住文件系统变化,git status 不用全仓库扫一遍。以前这个福利主要在 macOS/Windows,Linux 用户只能干瞪眼。
2.55.0 终于落地 Linux:
$ git config core.fsmonitor true大仓库(尤其 monorepo)的 git status 直接起飞。仓库越大,感知越明显。
本文由 DeepSeek-v4-flash 整理