Git 高级技巧实战:rebase、cherry-pick、bisect 一次讲透,冲突、回滚、定位 Bug 全流程
开场:OK,今天我们直接上手 Git 三连招
哈喽各位,eccfy 频道开整!今天这期不是“Git 基础入门”,而是你在真实项目里一定会撞上的三个高频动作:rebase、cherry-pick、bisect。我会按视频脚本的方式带你看屏幕操作:怎么改提交历史、怎么把某个修复单独拎到别的分支、怎么用二分法把“谁把 Bug 放进来的”精准抓出来。你可以边看边跟着敲,效果最好。
先说结论:这三个命令的价值,不是“炫技”,而是把混乱变成可控。比如你在 feature 分支上堆了 12 个 commit,要合并前整理成 4 个干净提交;比如线上 hotfix 只想挑一个提交回到 release 分支;比如回归测试说“昨天还好好的,今天炸了”,你就能用 bisect 把范围从 200 个 commit 缩到 8 个、4 个、2 个,最后一刀切中元凶。
Chapter 1:rebase 不是魔法,是“重放提交”
OK so,先看最常用的场景:你在 feature/login 上开发,main 分支已经前进了 6 个提交。此时别急着 merge,先拉最新再整理历史:
git fetch origingit rebase origin/main
这一步的本质,是把你当前分支上的提交重新播放到新的基线之上。好处很直观:历史线性、代码审查更清楚、冲突更早暴露。我实测过一个 18 个提交的功能分支,rebase 后把 6 个“修修补补”的提交压成 2 个逻辑提交,review 时间从 20 分钟降到 8 分钟,差距非常明显。
接下来重点来了:冲突怎么处理。一旦卡住,Git 会提示冲突文件。你就打开编辑器,解决后执行:
git add .git rebase --continue
如果你发现“这次 rebase 方向不对”,立刻撤回:
git rebase --abort
这里有个实战建议:公共分支尽量别做会改写历史的 rebase,尤其是别人已经拉走的分支。你可以把它记成一句话:个人分支用 rebase 整理,公共分支谨慎使用。如果你在搜“git rebase 教程”或者“rebase 冲突怎么解决”,这套流程就是最稳的。
Chapter 2:cherry-pick,像“单独拎出一个镜头”一样搬提交
现在切到第二个操作。假设你在 release/1.4 分支上,发现线上只有一个修复提交 4f2c1ab 该进来,其他功能都不该动。此时别合并整条分支,直接:
git cherry-pick 4f2c1ab
这就是 cherry-pick 的精髓:只搬一个 commit 的改动。如果是连续多个提交,也可以:
git cherry-pick A1B2C3D^..E5F6G7H
但我要提醒你:cherry-pick 很强,也很容易制造“重复修复”。尤其是同一个补丁先被主干合并,后来又被你 cherry-pick 到维护分支,未来再合并时可能出现冲突或重复提交记录。我的做法是:把“修复原因”和“原始 commit hash”写清楚,方便后续追踪。你甚至可以在提交信息里注明:cherry-picked from ...。
如果你平时会搜“git cherry-pick 怎么用”或“cherry-pick 冲突处理”,记住一个小技巧:遇到冲突时,先别慌,照样编辑文件、git add,然后 git cherry-pick --continue。想放弃就 git cherry-pick --abort。
Chapter 3:bisect,二分定位 Bug 的真正杀器
OK,进入全场最爽的部分:git bisect。场景非常真实——今天测试说“登录页偶发白屏”,你知道 bug 是最近才出现,但不知道是哪个提交。不要一条条看日志,直接二分:
git bisect startgit bisect badgit bisect good v1.3.0
Git 会自动切到中间某个 commit。你跑一次测试,如果坏了就执行 git bisect bad,如果好了就 git bisect good。每次都会把搜索范围砍半。假设从 128 个提交里找问题,理论上最多只要 7 次测试就能定位到目标附近,这就是二分查找的效率。
我自己的实战经验是:如果你有一个能自动跑的测试命令,bisect 会非常香。比如:
git bisect run npm test
这行命令会让 Git 自动帮你判断 good/bad,几乎像开挂。你在屏幕上会看到 commit 一路跳转,特别适合“前后对比”排查。这里我建议你在正式开跑前先准备一个稳定、可重复的验证脚本,否则测试本身不稳定,bisect 也会误判。
收尾:怎么判断你真的学会了
最后给你一个验证清单。你可以自己开一个临时仓库,做下面三件事:
- 先用
rebase把 3 个杂乱提交整理成线性历史,确认git log --oneline --graph变干净。 - 用
cherry-pick把某个修复提交拷到另一分支,确认git show能看到目标改动。 - 故意制造一个 Bug,再用
git bisect定位,确认最后输出的 commit 就是元凶。
如果你能把这三步完整跑通,说明你不是“会敲命令”,而是真的能拿 Git 解决问题。想继续看我把这套流程扩展成“多分支发布/回滚/热修复”的实战脚本,评论区告诉我;如果你需要一个稳定的网络或远程环境来拉仓库和同步代码,官方方案、免费方案和第三方工具都可以按你的实际情况自己选,最后一步我也放个可选项:roxi.cc。