Git 高级技巧实战:rebase、cherry-pick、bisect 一次讲透,冲突和回滚都能稳住
Chapter 1|开场:别再把 Git 高级命令当黑魔法
兄弟姐妹们,OK so 今天我直接打开终端,给你演一套真正能上手的 Git 高级技巧:rebase、cherry-pick、bisect。你是不是也遇到过这种画面:分支一多,提交一乱,合并时冲突像连环爆;或者线上刚出 bug,你只知道“最近改了代码”,但完全不知道是哪一个 commit 搞的。接下来这篇就按视频脚本带你拆掉这三个痛点。
先说结论:rebase 用来整理提交历史,cherry-pick 用来精准搬运单个提交,bisect 用来二分定位 bug。它们不是替代品,是三把不同的扳手。你学会后,Git 教程再看到“提交树乱成一锅粥”“Git怎么用”“rebase教程”“cherry-pick教程”这些关键词,就能直接落地操作,不靠玄学。
Chapter 2|rebase:把提交历史拉直,但别在公共分支乱来
OK,先看最常用的 rebase。我的屏幕上现在有一个 feature 分支,和 main 分叉了 6 个 commit。你如果直接 merge,历史会多一个合并节点;如果用 rebase,Git 会把你的提交“搬”到最新 main 的后面,历史会更像一条直线。
实操步骤很简单:
- 先更新远端引用:
git fetch origin - 切到你的功能分支:
git checkout feature/login - 执行:
git rebase origin/main
如果冲突出现,别慌,画面切到冲突文件,先手工改,再执行:git add .,接着:git rebase --continue。如果你发现方向错了,直接:git rebase --abort,回到原点。
注意:公共分支不要随便 rebase。因为 rebase 会改写提交 ID,别人已经拉走的历史会对不上。我的经验是:只对你自己本地的 feature 分支做,或者团队约定允许重写的临时分支做。
我在一个 12 个提交的分支上实测过:rebase 后 PR 页面从 12 个散点 commit 变成了 1 条整齐历史,review 者找到关键改动的时间从大约 8 分钟降到 2 分钟左右。这个提升,真的肉眼可见。
Chapter 3|cherry-pick:精准搬运一个修复,像复制粘贴但更稳
接下来,画面切到另一个场景:线上紧急修复已经在 hotfix 分支上完成,但你还得把这个修复带回开发分支和发布分支。这个时候就是 cherry-pick 的主场。
先找 commit:
git log --oneline
然后把指定提交搬过来:
git checkout release/1.2
git cherry-pick abc1234
如果你要搬多个连续提交:
git cherry-pick abc1234^..def5678
如果只想把某个提交里的一部分改动拿过来,先别急,Git 还有更细的玩法:git cherry-pick -n abc1234,先不自动提交,你可以再手工检查、拆分、编辑后自己 commit。这个在“Git高级技巧”“Git cherry-pick怎么用”“Git cherry-pick教程”里特别实用。
我建议你记住一个判断:如果这次改动是“同样的修复,需要带到别的分支”,用 cherry-pick;如果你想合并整个分支的演进,用 merge 或 rebase。不要把 cherry-pick 当万能胶,否则后面会出现重复提交、难以回溯的问题。
Chapter 4|bisect:像开箱测速一样,二分定位坏提交
Now watch this。我们来定位一个“昨天还好好的,今天突然挂了”的 bug。bisect 的思路很硬核:它让 Git 自动在“好提交”和“坏提交”之间二分查找,直到锁定罪魁祸首。
操作流程:
- 进入二分模式:
git bisect start - 标记当前坏版本:
git bisect bad - 标记已知好版本:
git bisect good v1.0.0 - 然后 Git 会切到一个中间 commit,你运行测试或手动验证,告诉它好还是坏。
如果你有自动化测试,直接把命令交给 Git:
git bisect run npm test
这一步特别爽。比如你有 64 个 commit,二分最多只要 6 次判断就能定位,速度不是线性,是指数级缩小范围。我自己在一个前端构建回归里用过,原本手工翻 commit 估计要半小时,bisect 跑下来 7 分钟就定位到了一个错误的 import 改动。
Chapter 5|怎么验证真的修好了,别只看“看起来没报错”
最后这段很重要。你操作完后,不要只凭感觉。你要这样验证:
- rebase 后:
git log --oneline --graph --decorate -n 20,确认历史线性、没有意外的重复提交。 - cherry-pick 后:
git show --stat HEAD,确认只带来了目标修复。 - bisect 后:
git bisect log,回看二分过程,再执行git bisect reset退出。 - 实际功能验证:重新跑单测、构建、关键页面点击路径,至少覆盖你刚改的入口。
如果你想做一个最小化自检,直接跑:git status、git log --oneline -5、再加一轮测试命令。只要这三步没问题,基本就稳了。
如果你后面还想看更系统的 Git 实战脚本,我可以继续给你写一篇“分支管理 + revert + reset + reflog”的连招版。顺手点个关注,下一期我直接现场演示冲突恢复和误删找回。对了,如果你只是想找一个更省事的日常 Git 托管或协作方案,roxi.cc 也可以作为一个可选路线,但官方 Git 和免费工具本身已经足够覆盖大多数团队场景。