15. 常用命令记不住?Git 别名让操作变成快捷键

「Git」系列已发布: 00. 改崩代码不敢回退?Git 版本控制 3 分钟救你狗命 | 01. Git 装完不会配?Windows/macOS/Linux 三端配置一次到位 | 02. Git 配置总踩坑?全局/仓库/SSH 密钥一次搞懂 | 03. add/commit/push 别再死记:Git 工作流核心概念实操 | 04. Git 分支管理:5 步彻底搞懂 branch 与 merge | 05. clone/fetch/pull/push 分不清?Git 远程协作实战 | 06. 给版本打上永久印记:Git 标签管理与发布实战 | 07. 切分支怕丢改动?Git stash 暂存恢复保护现场 | 08. rebase 不是 merge 的替代品:Git 故事线重构进阶 | 09. Git 日志与调试:log/blame/diff 让历史无所遁形 | 10. 提交代码自动检查:Git Hooks 实战,质量不再靠人工 | 11. 多仓库依赖怎么管?Git 子模块统一版本一键更新 | 12. GitFlow vs GitHub Flow vs 主干:团队工作流 3 选 1 | 13. 仓库越来越大?Git LFS 让图片视频不再撑爆仓库 | 14. 合并冲突不是噩梦:Git 合并策略与冲突解决 | 15. 常用命令记不住?Git 别名让操作变成快捷键(本文)

co、st、lg 这些短命别名能省下大量敲键盘时间。本文教你配置 Git 别名与自定义命令,把高频操作压缩成两个字母。

基础操作(第 03 篇)要熟。下面的别名都在终端里跑,也可以手动写进~/.gitconfig。

一、别名怎么建

# git config --global alias.<别名> '<Git 命令>'
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status

用起来:

git co main          # 等于 git checkout main
git br -a            # 等于 git branch -a
git ci -m "提交信息"
git st

1.1 查看已有的别名

# 方法一
git config --global --get-regexp alias

# 方法二
cat ~/.gitconfig | grep -A1 "\[alias\]"

# 方法三
git config --list | grep alias

1.2 值得设的别名

1.2.1 日志

# 简洁的一行日志
git config --global alias.lg "log --oneline --graph --decorate"

# 带作者和日期
git config --global alias.hist "log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short"

# 最近 N 条
git config --global alias.last "log -10 --oneline"

# 所有分支的提交树
git config --global alias.tree "log --oneline --graph --all --decorate"

1.2.2 差异

# 暂存区差异
git config --global alias.diffc "diff --cached"

# 只看文件名
git config --global alias.diffn "diff --name-only"

# 带统计
git config --global alias.diffs "diff --stat"

# 单词级
git config --global alias.diffw "diff --word-diff"

1.2.3 分支与提交

# 最近使用的分支

git config --global alias.branchr "for-each-ref --sort=-committerdate refs/heads/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset)'"

# 追加到上次提交
git config --global alias.amend "commit --amend --no-edit"

# 改上次提交信息
git config --global alias.remend "commit --amend"

# 撤销上次提交(保留修改)
git config --global alias.undo "reset --soft HEAD~1"

# 丢弃工作目录修改(慎用)
git config --global alias.discard "checkout --"

1.2.4 工作流

# 创建并切到新分支
git config --global alias.new "checkout -b"

# 删已合并的分支
git config --global alias.cleanup "!git branch --merged | grep -v '\\*\\|main\\|master\\|develop' | xargs -r git branch -d"

# 同步 Fork
git config --global alias.sync "!git fetch upstream && git checkout main && git merge upstream/main && git push origin main"

# 推送并设上游跟踪
git config --global alias.pushu "push -u origin HEAD"

1.3 用 Shell 写别名

多条命令用!前缀:

# 提交数最多的 10 位贡献者
git config --global alias.top "!git shortlog -sn --all | head -10"

# 仓库总行数(排除二进制和锁定文件)
git config --global alias.sloc "!git ls-files | grep -v '\.lock$\|\.png$\|\.jpg$\|\.jar$\|\.class$\|\.min\.' | xargs wc -l 2>/dev/null | tail -1"

# 交互式暂存
git config --global alias.pick "add -p"

# 找仓库里的大文件
git config --global alias.find-fat "!git rev-list --all --objects | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | sed -n 's/^blob //p' | sort -n --key=2 | tail -10 | cut -c 1-12,41- | $(command -v gnumfmt || echo numfmt) --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest"

# 打开仓库的 GitLab/GitHub 页面
git config --global alias.browse "!f() { open $(git remote get-url origin | sed 's/git@//;s/:/\//;s/.git$//' | awk '{print \"https://\"$1}'); }; f"

!关键特性:

  1. 在仓库根目录执行(不是当前目录)。
  2. $1、$2… 传参。
  3. 管道、条件判断等完整 Shell 语法都能用。

1.4 带参数的 Shell 别名

# 显示指定文件的提交历史
git config --global alias.filelog "!f() { git log --oneline --follow -- \"$1\"; }; f"

# 用法:git filelog src/config.py
# 给提交加 fixup 标记
git config --global alias.fixup "!f() { git commit --fixup \"$1\" \"${@:2}\"; }; f"

# 用法:git fixup HEAD~3

1.5 批量配置

直接贴到~/.gitconfig:

[alias]
# === 日志 ===
lg = log --oneline --graph --decorate
lga = log --oneline --graph --decorate --all
hist = log --pretty=format:'%C(yellow)%h%Creset %C(cyan)%ad%Creset | %s %C(green)%d%Creset %C(dim)[%an]%Creset' --graph --date=format:'%m-%d %H:%M'

# === 分支 ===
br = branch
bra = branch -a
co = checkout
new = checkout -b
del = branch -d
delf = branch -D

# === 提交 ===
ci = commit
cia = commit -a
amend = commit --amend --no-edit
remend = commit --amend

# === 状态与差异 ===
st = status -sb
df = diff
dfc = diff --cached
dfs = diff --stat
dfw = diff --word-diff

# === 暂存 ===
wip = stash push -m
unwip = stash pop

# === 远程 ===
pushu = push -u origin HEAD
sync = "!git fetch origin && git pull --rebase origin main"

# === 工具 ===
cleanup = "!git branch --merged | grep -v '\\*\\|main\\|master\\|develop' | xargs -r git branch -d"
today = "!git log --since='midnight' --oneline --author=\"$(git config user.name)\""
contrib = shortlog -sn --all --no-merges

1.6 自定义 Git 子命令

任何在$PATH里命名为git-<command>的可执行文件,都可以当成 Git 命令调用。

1.6.1 git-cleanup-branches

#!/bin/bash

# 存为 /usr/local/bin/git-cleanup-branches,加执行权限
set -e
DRY_RUN=false
OLDER_THAN="30 days ago"
while [[ $# -gt 0 ]]; do
case $1 in
--dry-run) DRY_RUN=true; shift ;;
--older-than) OLDER_THAN="$2"; shift 2 ;;
*) echo "未知参数:$1"; exit 1 ;;
esac
done
MERGED_BRANCHES=$(git branch --merged main | grep -v '\*\|main\|master\|develop')
if [ -z "$MERGED_BRANCHES" ]; then
echo "没有找到已合并的分支。"
exit 0
fi
echo "以下分支已合并到 main:"
echo "$MERGED_BRANCHES"
echo ""
if [ "$DRY_RUN" = true ]; then
echo "模拟运行模式,未实际删除。"
else
echo "$MERGED_BRANCHES" | xargs git branch -d
echo "已删除以上分支。"
fi

用起来:

chmod +x /usr/local/bin/git-cleanup-branches

# 先预览
git cleanup-branches --dry-run

# 执行
git cleanup-branches

1.6.2 git-standup

# 存为 /usr/local/bin/git-standup

#!/bin/bash
AUTHOR=${1:-$(git config user.name)}
SINCE=${2:-"yesterday"}
echo "=== $AUTHOR 自 $SINCE 起的提交 ==="
git log --since="$SINCE" --author="$AUTHOR" \
--pretty=format:'%C(yellow)%h%Creset %s %C(dim)(%ar)%Creset' \
--reverse --all

1.7 团队共享别名

项目根目录建.gitconfig-repo:

[alias]
pr = "!f() { git push -u origin HEAD -o merge_request.create -o merge_request.title=\"$1\"; }; f"
lint = "!pre-commit run --all-files"
setup = "!bash scripts/setup.sh"

成员加载:

git config --local include.path ../.gitconfig-repo

1.8 文章引用

📌 本文首发于微信公众号 【运维知识点滴】——专注运维实战干货,微信搜索“运维知识点滴”或扫下方二维码关注,更新不迷路。

微信公众号【运维知识点滴】 微信小程序【A5单据合并&大试卷拆分转A4打印】
运维实战干货 · 关注追更 Word 转 PDF · 试卷/发票打印神器 · 免费
运维实战干货 · 关注追更 Word 转 PDF · 试卷/发票打印神器 · 免费

💡 小程序【A5单据合并&大试卷拆分转A4打印】是干嘛的? 一个 Word 转 PDF 的打印神器,专治“文档版式和打印机对不上”:

  • A3 试卷打不出来? 学校发的电子版试卷多是 A3,家用打印机只吃 A4——上传 Word 一键转换:可缩到一页 A4(页数不变),也可对半拆成两张 A4(1:1 原大、字更清晰),两种模式自选;
  • 版式不乱:真实渲染引擎原样转换、绝不重排内容,转出的 PDF 和原 Word 排版一致,公式/表格/图片不跑版;
  • 两张 A5 单据拼一张 A4:出租车票、火车票等报销凭证拼版后,一次打印、整齐粘贴;
  • 隐私省心:无需注册,转换结果留存 5 天、最多下载 5 次即自动删除,不留任何历史记录;
  • 微信扫码即用,免费、免安装,支持 doc / docx(≤50MB)。

上一篇:14. 合并冲突不是噩梦:Git 合并策略与冲突解决