摘要:
git add、git commit、git push——这三个命令占了大多数程序员 Git 使用的 80%。但 Git 的设计远不止这些:交互式暂存、选择性回滚、bisect二分法定位 bug、reflog找回丢失的 commit、worktree同时开发两个分支……本文整理了 10 个 Git 进阶技巧,每个附真实场景和完整命令。文末补充一个"不打开终端也能知道当前分支"的彩蛋:SpacePeek 的 Git 仓库检测功能。
本文信息:基于 Git 2.45+ / macOS 15.0 Sequoia 实测。所有命令均为 Git 原生支持,无需安装任何额外工具。
一、前言
Git 不是你用得越多就越熟练,是你用得越深才越熟练
我见过很多程序员,Git 用了五年,日常命令仍然只有 6 个:status、add、commit、push、pull、checkout。遇到冲突就手动改文件,遇到不小心删掉的 commit 就重新写,遇到需要回滚的发布就 git reset --hard 赌一把。
Git 是一个被严重低估的工具。它不仅仅是一个"代码备份系统"——它是一台时间机器、一个侦探工具、一个并行开发的沙盒。以下 10 个技巧,每一个都能让你的 Git 效率翻倍。
二、10 个进阶技巧
技巧 1:git add -p — 只暂存一个文件的一部分
场景:你在一个文件里改了 5 处,但只有 2 处和当前需求相关,另外 3 处是顺手改的实验性代码。你不想分成两个 commit 提交——但你也确实不想把实验代码和正式功能混在一起。
git add -p filename.ts
它会做什么:Git 会把这个文件拆成多个"块"(hunk),逐块问你:这个块要暂存吗?
(1/5) Stage this hunk [y,n,q,a,d,e,?]?
y → 暂存这个块
n → 跳过这个块
s → 把这个块拆得更小
e → 手动编辑这个块(只保留你想要的行)
为什么这很重要:git add -p 让你可以精确控制每次 commit 的内容。你的 commit history 不再是"一堆不相关的改动混在一起",而是每个 commit 只做一件事。
技巧 2:git commit --amend — 修改上一次 commit
场景:你刚 git commit 完,发现漏了一个文件、或者 commit message 有错别字、或者你忘了改那个变量的名字。你不想再创建一个"fix typo"的 commit。
# 漏了文件
git add 漏掉的文件
git commit --amend --no-edit # 保持原 message,只追加文件
# commit message 写错了
git commit --amend -m "正确的新 message"
注意:--amend 会改写历史——它创建了一个新的 commit 替换旧的。只在自己还没 push 的 commit 上用。 如果已经 push 了,你需要 --force push,会影响其他协作者。
技巧 3:git stash 进阶 — 暂存工作区的正确姿势
场景:你正在 feature 分支上写代码,突然有人说 main 分支有个紧急 bug 需要修。你不能直接切到 main——你当前的改动还没 commit。你也不想 commit 一堆半成品代码。
# 标准 stash
git stash # 暂存所有改动,工作区变干净
git checkout main # 去修 bug
git checkout feature # 回来
git stash pop # 恢复之前的改动
# 进阶:只 stash 一部分文件
git stash push -m "数据库相关的改动" src/db/
# 查看 stash 列表
git stash list
# 取回指定的 stash(不删除 stash 记录)
git stash apply stash@{1}
技巧 4:git bisect — 二分法定位哪个 commit 引入了 bug
场景:你发现一个 bug,但它是在过去的 200 个 commit 中间的某一个引入的。你不知道是哪一个。你不想逐个 checkout 200 次去测试。
git bisect start
git bisect bad HEAD # 当前版本有 bug
git bisect good v2.0.0 # 这个版本没有 bug
Git 会自动 checkout 中间的 commit。你测试 → 告诉 Git 这个版本是好还是坏 → Git 继续二分 → 重复 7-8 次 → 定位到引入 bug 的精确 commit。
git bisect good # 当前版本没问题,bug 在后面
git bisect bad # 当前版本有问题,bug 在前面
# ... 重复 7-8 次 ...
<commit_hash> is the first bad commit
git bisect reset # 回到正常状态
为什么这很重要:200 个 commit 只需 log₂(200) ≈ 8 次测试就能定位。这是 Git 最被低估的功能之一。
技巧 5:git reflog — 找回误删的 commit
场景:你做了 git reset --hard,把一个还没 push 的 commit 删了。Git 告诉你"这个 commit 没了"——它没告诉你的是,这个 commit 其实还在,只是没有引用指向它了。
git reflog
输出:
abc1234 HEAD@{0}: reset: moving to HEAD~1
def5678 HEAD@{1}: commit: 完成用户登录模块
即使你 reset 掉了 def5678,reflog 仍然记得它 30 天。恢复它:
git checkout def5678 # 切到这个 commit
git checkout -b recovered # 基于它创建新分支
关键认知:Git 几乎不会真正删除数据——它只会移除引用。reflog 是那个"保留所有未被引用数据"的日志。
技巧 6:git worktree — 同时开发两个分支
场景:你正在 feature 分支上跑一个需要 10 分钟的测试。这时候你想切到 main 分支看看另一段代码——但你不想中止测试。传统的做法是用 git stash + 切分支 + 看完 + 切回来 + git stash pop——总共 5 步。
# 在 feature 分支跑测试的同时,创建一个 main 的 worktree
git worktree add ../project-main main
# 现在你有两个目录:
# ~/project → feature 分支(测试还在跑)
# ~/project-main → main 分支(独立的工作区)
两个目录共享同一个 .git 仓库,但各有独立的工作区。不需要 stash、不需要中断任何东西。
技巧 7:git rebase -i — 整理 commit 历史
场景:你在 feature 分支上开发了 3 天,提交了 15 个 commit——“WIP”、“fix typo”、“尝试方案 A”、“回到方案 B”、“终于可以了”。你准备合并到 main,但你不想让这些凌乱的 commit 污染主分支的历史。
git rebase -i main
它会做什么:打开编辑器,列出你的 15 个 commit。你可以:
pick→ 保留这个 commitsquash→ 把这个 commit 合并到上一个reword→ 改 commit messagedrop→ 删除这个 commit
把 15 个"WIP"合并成 3 个干净的 commit,每个对应一个完整的功能点。
技巧 8:git log 的高级筛选 — 别只会 git log --oneline
# 只看某个作者最近一周的 commit
git log --author="张三" --since="1 week ago" --oneline
# 看某个文件中某个函数的修改历史
git log -L :函数名:文件路径
# 看两个分支的差异
git log main..feature --oneline # feature 有但 main 没有的 commit
git log feature..main --oneline # main 有但 feature 没有的 commit
技巧 9:git blame 不是甩锅工具,是调查工具
# 看每行代码是谁、什么时候、在哪个 commit 中修改的
git blame 文件路径
# 只看某几行(如 100-150 行)
git blame -L 100,150 文件路径
# 忽略空白变更(只看有意义的修改)
git blame -w 文件路径
当你不理解某段代码为什么这样写时,git blame 能告诉你这段代码背后的人和时间——你可以直接去问那个人。
技巧 10:.gitconfig 别名 — 把频繁操作压缩成两个字母
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.st status
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.undo 'reset --soft HEAD~1'
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --all"
最常用:git lg 输出一个彩色的分支可视化图。每次合并前看一眼,确认你的分支历史和你的理解一致。
三、一个彩蛋:不打开终端也能知道当前分支
上面 10 个技巧都是命令行。但有时候你只是想知道"这个项目文件夹当前在哪个分支"——你不想 cd 进去 git status。
如果你装了 SpacePeek,选中项目文件夹 → 按空格 → Overview 视图自动显示:
- 当前分支名
- 最近一次 commit 的作者和 message
- 是否有未提交的修改
不需要开终端,不需要 cd,不需要敲一个字母。这个功能对管理 10+ 个仓库的开发者来说,每天能省下几十次"切到终端 → 切回来"的切换。
App Store 搜「SpacePeek」,免费下载。装完记得去系统设置 → 通用 → 登录项与扩展 → Quick Look → 打开开关。

四、总结
三点核心
-
Git 的效率不在于你敲命令有多快,在于你知不知道有这条命令。
git bisect把 200 个 commit 的排查从"半天"压缩到"5 分钟"。git reflog把"误删的 commit"从"丢了"变成"还能找回来"。不是更快地做错误的事,是做正确的事。 -
git add -p和git rebase -i是让 commit history 从垃圾变成档案的两个关键。 每个 commit 只做一件事 + commit history 干净整洁 = 六个月后你仍然能读懂自己的代码。这个习惯不是"洁癖",是"对自己未来的善意"。 -
终端和图形化配合才是最佳工作流。 复杂的 Git 操作在终端里更灵活(
rebase -i、bisect、reflog)。简单的信息查询用 SpacePeek 按空格更快捷(当前分支、最近 commit)。两者不冲突——在正确的场景用正确的工具。
测试环境:Git 2.45 / macOS 15.0 Sequoia / 2026 年 7 月
你的
.gitconfig里最离不开的 alias 是哪个?评论区分享一下——我挑 5 个最实用的加到下一版文章里。
344



被折叠的 条评论
为什么被折叠?



