Git 救命三板斧:cherry-pick、rebase -i 与 bisect 实战
Git æå½ä¸æ¿æ§ï¼cherry-pickãrebase -i ä¸ bisect 宿
æ¯ä¸ªå¼åè
é½ä¼éå°è¿æ ·çæ¶å»ï¼æäº¤åå²ä¹±æä¸å¢ãæ¥éä»å«ç忝æä¸ä¸ªè¡¥ä¸è¿æ¥ãæè
线ä¸çªç¶åºäº bug å´ä¸ç¥éæ¯åªæ¬¡æäº¤å¼å
¥çãè¿æ¶åï¼ææ¡ Git çä¸ä¸ª"æå½"å½ä»¤è½å¸®ä½ ä½é¢å°è§£å³é®é¢ãæ¬æç¨ä¸ä¸ªçå®åºæ¯ï¼è®²é cherry-pickãrebase -i å bisectã
åºæ¯ä¸ï¼cherry-pickââåªææä¸ä¸ªæäº¤
å
¸åå°å¢ï¼ä½ å¨ feature-A 忝ä¸ä¿®äºä¸ä¸ªç´§æ¥ bugï¼æäº¤æ¯ a1b2c3dãåæ¶ main 忝ä¸ä¹åºç°äºåæ ·çé®é¢ï¼ä½ feature-A è¿æä¸å 没åå®çåè½ä¸è½åè¿å»ãæä¹åï¼
# åªæé£ä¸ªä¿®å¤æäº¤æå° main
git switch main
git cherry-pick a1b2c3d
cherry-pick çåçæ¯ï¼ååºæå®æäº¤ç diff è¡¥ä¸ï¼åºç¨å°å½å忝æ«ç«¯ï¼å¹¶çæä¸ä¸ªæ°çæäº¤ï¼åå¸å¼ä¼åï¼å ä¸ºç¶æäº¤ä¸åï¼ã
䏿¬¡æå¤ä¸ª
# æååºé´ï¼ä¸å«èµ·ç¹ï¼å«ç»ç¹ï¼
git cherry-pick a1b2c3d..f4e5d6c
# åªææå 个ä¸è¿ç»çæäº¤
git cherry-pick a1b2c3d f4e5d6c
å²çªå¤ç
cherry-pick éå°å²çªæ¶ä¼åä¸ï¼æ è®°å²çªæä»¶ï¼
# 1. æå¨è§£å³å²çªï¼ç¼è¾æä»¶ï¼
# 2. æ 记为已解å³
git add src/app.js
# 3. ç»§ç»
git cherry-pick --continue
# æ³æ¾å¼æ´ä¸ª cherry-pickï¼æ¢å¤åç¶
git cherry-pick --abort
é¿åè¦ç¹ï¼cherry-pick ä¼å¤å¶æäº¤ä½ä¸ä¿çåæäº¤çç¶å
³ç³»ï¼æä»¥è¢«æè¿æ¥çæäº¤å¨ç®æ 忝䏿¯"å¤å¿"ââå°æ¥ç¨ git log 追å岿¶è¦æè¯å°è¿ä¸ç¹ï¼å«ææè½å¨å忝çä½ç½®æ¾å°å®ã
åºæ¯äºï¼rebase -iââæäºæ¬¡"fix typo"æ¹æä¸æ¬¡æäº¤
å
¸åå°å¢ï¼åè½å¼å宿¯ï¼git log é躺ç feat: ç¨æ·æ¨¡åãfix typoãfix reviewãwipãfix typo again äºä¸ªæäº¤ãç´æ¥åå¹¶è¿å»å°±æ¯æ±¡æä¸»å¹²åå²ã交äºå¼ååºå¯ä»¥æå®ä»¬ææä¸ä¸ªå¹²åçæäº¤ã
# 对æè¿ 5 个æäº¤å交äºå¼ååº
git rebase -i HEAD~5
ç¼è¾å¨ä¼æå¼ä¸ä¸ªå¾ 忏 åï¼
pick a1b2c3d feat: ç¨æ·æ¨¡å
pick e4f5g6h fix typo
pick i7j8k9l fix review comments
pick m0n1o2p wip
pick q3r4s5t fix typo again
# Rebase æä»¤éæ¥ï¼
# p, pick ä¿ç该æäº¤
# r, reword ä¿çä½ä¿®æ¹æäº¤ä¿¡æ¯
# e, edit ä¿çä½å䏿¥ä¿®æ¹å
容
# s, squash ä¿çä½å¹¶å
¥åä¸ä¸ªæäº¤ï¼ä¿¡æ¯ä¹åå¹¶ï¼
# f, fixup å¹¶å
¥åä¸ä¸ªæäº¤ï¼ä¸¢å¼ä¿¡æ¯ï¼
# d, drop å é¤è¯¥æäº¤
æ¹åæï¼
pick a1b2c3d feat: ç¨æ·æ¨¡å
fixup e4f5g6h
fixup i7j8k9l
fixup m0n1o2p
fixup q3r4s5t
ä¿åéåºï¼äºä¸ªæäº¤ç¬é´ææä¸ä¸ªãfixup å squash çåºå«ï¼squash 伿å¼ç¼è¾å¨è®©ä½ åå¹¶æäº¤ä¿¡æ¯ï¼fixup ç´æ¥ä¸¢å¼è¢«å¹¶å ¥æäº¤çä¿¡æ¯ââæ¸ ç fix typo ç±»æäº¤ç¨ fixup æå¹²åã
rewordï¼ä¿®æ¹åå²æäº¤ä¿¡æ¯
git rebase -i HEAD~3
# æç®æ è¡ä» pick æ¹ä¸º rewordï¼ä¿ååä¼å¼¹åºç¼è¾å¨è®©ä½ æ¹ä¿¡æ¯
é»éæ³åï¼rebase ä¼éåæäº¤åå²ãåªå¯¹è¿æ²¡ææ¨éå°è¿ç¨ãæåªæä½ ä¸ä¸ªäººç¨ç忝å rebaseã对å
±äº«åæ¯ rebase ä¼å¯¼è´åäºçæäº¤åå²åä½ ååï¼å¼åæ å°½çå²çªå©æ¢¦ãæ¿ä¸åçæ¶åå°±å
git branch backup-before-rebase çæ¡åè·¯ã
åºæ¯ä¸ï¼bisectââäºåæ¥æ¾å¼å ¥ bug çæäº¤
å
¸åå°å¢ï¼æ¨å¤©è¿å¥½å¥½ç代ç ï¼ä»å¤©è·ä¸äºäºãä¸é´éç 60 个æäº¤ï¼éä¸ªæ£æ¥è¦åå°æ¶ãgit bisect ç¨äºåæ¥æ¾ï¼6 次就è½å®ä½ã
git bisect start
git bisect bad # å½å HEAD æ¯åç
git bisect good v2.3.0 # è¿ä¸ª tag æ¯å¥½ç
Git å¼å§äºåï¼æ¯æ¬¡æ£åºä¸ä¸ªä¸é´æäº¤ï¼ä½ æµè¯ååè¯å®ç»æï¼
npm test # è·æµè¯ææå¨éªè¯
git bisect bad # è¿ä¸ªæäº¤ä¹æ¯åç
# æè
git bisect good # è¿ä¸ªæäº¤æ¯å¥½ç
éå¤å è½®åï¼Git ä¼è¾åºï¼
a1b2c3d is the first bad commit
commit a1b2c3d
Author: Zhang San <zhangsan@example.com>
Date: Mon Oct 13 15:22:31 2026 +0800
perf: ä¼åç¨æ·æ¥è¯¢é»è¾
å®ä½å®æåï¼
git bisect reset # åå°ååæ¯ï¼æ¸
ç bisect ç¶æ
èªå¨å bisectï¼è®©èæ¬æ¥å¤æ
妿æä¸ªæµè¯è½èªå¨å¤å®å¥½åï¼bisect å¯ä»¥å ¨èªå¨è·å®ï¼
git bisect start HEAD v2.3.0
git bisect run npm test -- --grep "ç»å½æ¨¡å"
bisect run 对æ¯ä¸ªåæäº¤æ§è¡å½ä»¤ï¼éåºç 0 表示 goodï¼é 0ï¼1-127ï¼é¤ 125ï¼è¡¨ç¤º badãæ³¨æ 125 æ¯ä¿çç ï¼è¡¨ç¤º"è¿ä¸ªæäº¤æ æ³æµè¯"ï¼æ¯å¦ç¼è¯å¤±è´¥ï¼ï¼bisect ä¼èªå¨è·³è¿ã
宿æå·§ï¼å
ç¨ git log --oneline v2.3.0..HEAD -- src/ 缩å°å¯çæä»¶èå´ï¼å¦æ bug ææ¾å¨æä¸ªæ¨¡åï¼çè³å¯ä»¥å
ç¨ git bisect start HEAD v2.3.0 -- src/user/ éå®è·¯å¾ï¼åå°æ¯ä¸ªåæäº¤çå¹²æ°ã
ä¸ä¸ªå½ä»¤çéç¨å³ç
| å¤å¢ | å½ä»¤ | ä¸å¥è¯å¿æ³ |
|---|---|---|
| å«ç忝æä¸ªæäº¤æ³è¦ | cherry-pick |
æè¡¥ä¸ï¼ä¸æåæ¯ |
| åå²æäº¤å¤ªä¹±è¦æ´ç | rebase -i |
æªæ¨éç忝æè½æ |
| ä¸ç¥é bug åªæ¥ç | bisect |
äºåæ¥æ¾ï¼è®©æºå¨è·è ¿ |
å°ç»
cherry-pick è§£å³"æäº¤æ¬å®¶"ï¼rebase -i è§£å³"å岿´å®¹"ï¼bisect è§£å³"çç¯è¿½è´£"ãä¸è
å
±åçææ³æ¯ï¼æ Git 彿坿£ç´¢ãå¯è£åªçå岿°æ®åºï¼è䏿¯åªè½è¿½å çé»çã䏿¬¡éå°ä¹±éº»è¬çæäº¤å岿¶ï¼å¸æè¿ä¸æ¿æ§è½å¸®ä½ 干忶åºã
ä½ å¨å·¥ä½ä¸è¿ç¨è¿åªäºæå½å½ä»¤ï¼æ¬¢è¿è¯è®ºåºäº¤æµã
- 点赞
- 收藏
- 关注作者
评论(0)