本文目录导读:

Git 别名(最常用,直接提升日常速度)
添加到 ~/.gitconfig 的 [alias] 部分。
[alias]
# 1. 超简日志(一行显示)
lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
# 2. 查看所有分支及最后提交
branches = branch -a -v
# 3. 删除已合并的本地分支(安全清理)
# 用法:git cleanup
cleanup = !git branch --merged | grep -v '\\*\\|master\\|main\\|develop' | xargs -n 1 git branch -d
# 4. 撤销最近的commit但不丢失修改
# 用法:git undo (等价于 git reset --soft HEAD~1)
undo = reset --soft HEAD~1
# 5. 查看当前状态摘要
st = status -s
# 6. 交互式变基最近n个commit
# 用法:git rebase -i HEAD~n
# 可进一步简化为:git rbi n
ri = rebase -i
# 7. 搜索所有分支中某个字符串
# 用法:git find "string"
find = "!f() { git log --all --oneline --grep \"$1\" ; }; f"
# 8. 放弃工作区的所有未暂存修改(⚠️ 危险,确认后再用)
discard = checkout -- .
Shell 函数 / 脚本(增强 Git 命令)
放入 ~/.bashrc 或 ~/.zshrc,source ~/.bashrc。
快速切换分支(模糊匹配)
# 用法:gco feat → 自动切换到第一个包含feat的分支(本地或远程)
gco() {
if [ -z "$1" ]; then
git checkout
else
git checkout $(git branch -a | grep -v 'remotes/origin/HEAD' | grep "$1" | head -n 1 | tr -d ' ')
fi
}
查看当前分支相对于远程的提交差异计数
# 用法:gcount → 输出 "当前分支领先远程3个commit,落后1个commit"
gcount() {
local ahead=$(git rev-list --count origin/$(git_current_branch)..HEAD)
local behind=$(git rev-list --count HEAD..origin/$(git_current_branch))
echo "领先远程:$ahead 个commit,落后远程:$behind 个commit"
}
# 辅助函数(获取当前分支名)
git_current_branch() {
git rev-parse --abbrev-ref HEAD
}
批量删除远程已合并的分支(安全)
# 用法:gclean-remote → 删除所有已经被合并到main的远程分支(不删除main、master)
gclean-remote() {
git branch -r --merged origin/main | grep -v 'origin/main\|origin/master\|origin/HEAD' | sed 's/origin\///' | xargs -I {} git push origin --delete {}
}
自动解决冲突(谨慎使用,仅用于明确需求时)
# 用法:gresolve "their" → 所有冲突都采用传入分支的版本
# 若用 "ours" 则采用当前分支的版本
gresolve() {
local strategy="${1:-their}"
if [ "$strategy" = "their" ]; then
git checkout --theirs .
else
git checkout --ours .
fi
git add -A
echo "冲突已自动标记为采用[$strategy]版,请检查后执行git commit"
}
自动化工作流脚本(适合团队或复杂项目)
自动拉取并合并多个仓库(monorepo 或多项目)
#!/bin/bash
# 文件名:gup-all.sh
# 用法:放在project目录下,执行 ./gup-all.sh
for dir in */; do
if [ -d "$dir/.git" ]; then
echo "=== 正在更新 $dir ==="
cd "$dir" && git pull --rebase && cd ..
fi
done
一键创建功能分支并推送到远程
# 用法:gnew feat/user-login
gnew() {
if [ -z "$1" ]; then
echo "请提供分支名,gnew hotfix/typo"
return 1
fi
git checkout -b "$1"
git push -u origin "$1"
echo "已创建并推送分支 $1"
}
查找并删除大文件(胖仓库清理)
# 用法:gfind-large size=10M → 查找并列出大于10MB的文件
gfind-large() {
local size="${1:-10M}"
git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | sed -n 's/^blob //p' | awk '$2 >= '"$(echo $size | sed 's/M//')"' * 1048576' | sort -n -k2 | tail -10
}
错误修复与恢复类
还原某个文件到指定commit的版本
# 用法:grevert-file abc123 src/index.js
grevert-file() {
if [ -z "$1" ] || [ -z "$2" ]; then
echo "用法:grevert-file <commit-hash> <filename>"
return 1
fi
git checkout "$1" -- "$2"
}
交互式整理本地分支(选择删除)
# 用法:gclean-interactive
gclean-interactive() {
git branch | grep -v 'main\|master\|*' | while read branch; do
echo -n "删除分支 '$branch' ? (y/N): "
read -r answer
if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
git branch -D "$branch" && echo "已删除 $branch"
else
echo "跳过 $branch"
fi
done
}
安装与使用建议
- 别名:直接粘贴到
~/.gitconfig的[alias]下。 - Shell函数:追加到
~/.bashrc或~/.zshrc,然后执行source ~/.bashrc。 - 独立脚本:保存为文件(如
gnew.sh),放到~/bin/并chmod +x,确保该目录在PATH中。 - 防止误操作:对于删除、强制推送等操作,建议先在
echo模式下测试一次,或添加确认提示。
效率提升对比(示例)
| 操作 | 原生命令 | 加上别名/脚本 | 节省操作 |
|---|---|---|---|
| 查看漂亮日志 | git log --graph --oneline --all |
git lg |
减少约20个字符 |
| 撤销上次commit | git reset --soft HEAD~1 |
git undo |
无脑反向思维 |
| 清理本地陈旧分支 | git branch --merged \| grep -v master \| xargs git branch -d |
git cleanup |
单条命令搞定 |
| 创建并推送分支 | git checkout -b feat/a && git push -u origin feat/a |
gnew feat/a |
两步变一步 |