可通过在~/.gitconfig中定义shell函数别名实现,如diff-branches = "!f() { git diff \"$1\"...\"$2\"; }; f”,支持传参、处理空格、使用...语义,并可扩展--name-only、--stat等选项及路径过滤。

git diff 两个分支时怎么省掉重复输入分支名
直接配别名,让 git diff-branches main develop 这种命令一键生效。核心是用 shell 函数封装 git diff,避免写死分支名,也避开 alias 无法传参的限制。
在 ~/.gitconfig 里加一段:
[alias]
diff-branches = "!f() { git diff \"$1\"...\"$2\"; }; f"
这样调用时,$1 和 $2 就分别对应第一个、第二个参数,比如:
git diff-branches main feature/login → 等价于 git diff main...feature/login
注意三点:
- 必须用双引号包裹
"$1"和"$2",否则分支名含空格或特殊字符会报错 - 用
...(三点)而非..(两点),默认比较「两分支最新共同祖先到各自 tip」,更符合“差异”的直觉 - 别名值开头的
!表示后面是 shell 命令,不是内置 git 命令
想看文件列表不显示具体变更内容怎么办
加 --name-only 或 --name-status 参数就行,但得让别名支持可选开关。推荐用带条件判断的函数:
[alias]
diff-files = "!f() { if [ \"$#\" -eq 2 ]; then git diff --name-only \"$1\"...\"$2\"; else git diff --name-only HEAD...\"$1\"; fi; }; f"
这个别名行为更灵活:
-
git diff-files main develop→ 列出两个分支间变动的文件名 -
git diff-files develop→ 只给一个参数时,默认跟当前HEAD比
如果还想看到新增/修改/删除状态(A/M/D),把 --name-only 换成 --name-status 即可。
Windows Git Bash 下执行失败常见原因
主要卡在换行符和引号处理上。Git for Windows 自带的 Bash 对 ! 开头的 alias 支持不稳定,尤其路径含空格时容易崩。
稳妥做法是改用外部脚本:
- 新建文件
~/bin/git-diff-branches(确保~/bin在$PATH中) - 内容写成标准 bash 脚本:
#!/bin/bash git diff "$1"..."$2"
- 然后在
.gitconfig里写:[alias] diff-branches = "!f() { git-diff-branches \"$1\" \"$2\"; }; f"
比纯 alias 更健壮,也能方便加日志或参数校验。
diff 结果太多看花眼,怎么快速定位关键变更
git diff 本身不提供过滤,但可以组合 -- 限定路径,或用 grep 配合别名:
[alias]
diff-js = "!f() { git diff \"$1\"...\"$2\" -- '*.js'; }; f"
这样 git diff-js main develop 只显示 JS 文件差异。
更实用的是加 git diff --stat 快览改动规模:
[alias]
diff-stat = "!f() { git diff --stat \"$1\"...\"$2\"; }; f"
输出类似:src/utils.js | 12 +-,一眼看出哪些文件动得多。注意 --stat 不受 core.pager 影响,不会触发分页,适合 CI 或快速检查。
真正复杂的情况——比如跨多个远端分支、需要排除某些目录、或想导出 patch——就别硬塞进别名了,该写脚本写脚本,别为了省一次敲字牺牲可维护性。











