@@ -1019,6 +1019,113 @@ git pull --rebase = git fetch + git rebase
10191019
10201020直接執行 ` git rebase --abort ` 即可回到之前的狀態。
10211021
1022+ ## git-cherry-pick
1023+
1024+ 看影片會更清楚,手把手帶大家動手做 [ Youtube Tutorial - git-cherry-pick] ( https://youtu.be/x3UtKUvlDdI )
1025+
1026+ git-cherry-pick 這個指令大家可能會比較陌生:confused :
1027+
1028+ 沒關係,我們先來看 [ 官方] ( https://git-scm.com/docs/git-cherry-pick ) 的說明
1029+
1030+ ``` text
1031+ git-cherry-pick - Apply the changes introduced by some existing commits
1032+ ```
1033+
1034+ 看完官方說明還是:question ::question ::question :
1035+
1036+ 沒關係,我來假設一個情境 ( 理解完它你就了解了 git-cherry-pick 的用途了 ),
1037+
1038+ 假設現在 master 分支的 log 如下圖
1039+
1040+ ![ alt tag] ( https://i.imgur.com/cMcn6yE.png )
1041+
1042+ 然後有一個 v1 的分支 log 如下圖
1043+
1044+ ![ alt tag] ( https://i.imgur.com/OZ7JLke.png )
1045+
1046+ 現在我希望 merge v1 分支中的 14dee93 - add d.py 這個 commit
1047+
1048+ ( 因為 14dee93 這個 commit 實在太棒了或是因為某些原因只需要這個 commit )
1049+
1050+ 遇到上述這種情況,就很適合使用 git-cherry-pick,也就是說我想要其他分支中的某幾個 commit 而已,
1051+
1052+ 不需要全部,換句話說,就是撿其他分支中的 commit 過來使用。
1053+
1054+ 了解了適合的使用情境,接下來我們就來實戰:smirk :
1055+
1056+ 首先,我想要 v1 分支中的 14dee93 - add d.py 這個 commit,
1057+
1058+ 所以我先切到 master 分支,接著執行
1059+
1060+ ``` cmd
1061+ git cherry-pick 14dee93
1062+ ```
1063+
1064+ 如果你想要一次撿很多的分支過來也是可以,直接使用空白隔開即可
1065+
1066+ ``` cmd
1067+ git cherry-pick 14dee93 xxxxxx xxxxxx xxxxxx xxxxx
1068+ ```
1069+
1070+ 如果沒有衝突,就會看到如下圖
1071+
1072+ ![ alt tag] ( https://i.imgur.com/YITXxMk.png )
1073+
1074+ 再觀看一下 master 的 log
1075+
1076+ ![ alt tag] ( https://i.imgur.com/iGEIDZL.png )
1077+
1078+ 你會發現我們成功把 v1 分支中的 14dee93 - add d.py 這個 commit 拿過來
1079+
1080+ 使用了,但現在它的 commit id 卻是 ab70429,這個是正常的,因為它需要
1081+
1082+ 重新新計算:smile :
1083+
1084+ 其實,你會發現 git-cherry-pick 沒有想像中的困難:satisfied :
1085+
1086+ 在 cherry-pick 時,難免會遇到衝突,這邊我就再多做一個衝突的範例,
1087+
1088+ 假設 master 的 log 如下
1089+
1090+ ![ alt tag] ( https://i.imgur.com/pttbQ5U.png )
1091+
1092+ v1 分支中的 log 如下,我想要它的 3a2f29a - add c.py and print world 這個 commit
1093+
1094+ ![ alt tag] ( https://i.imgur.com/RFibHS6.png )
1095+
1096+ v2 分支中的 log 如下,我想要它的 553587b - add f.py這個 commit
1097+
1098+ ![ alt tag] ( https://i.imgur.com/I6L2Fwq.png )
1099+
1100+ 接下來我們就切回 master,然後 cherry-pick 這兩個 commit,
1101+
1102+ 這時候你會發現,它衝突了:fearful :
1103+
1104+ ![ alt tag] ( https://i.imgur.com/fAtQET0.png )
1105+
1106+ 使用 ` git status ` 看一下狀態,其實 A 的部分都教你如何解衝突了
1107+
1108+ ![ alt tag] ( https://i.imgur.com/J8ZpPng.png )
1109+
1110+ 首先,我們先將 c.py 修正後,執行 ` git add c.py ` ,接著再按照 A 的部份
1111+
1112+ 執行 ` git cherry-pick --continue ` ,就時候會跳出一個編輯視窗,
1113+
1114+ ![ alt tag] ( https://i.imgur.com/giylVAL.png )
1115+
1116+ 輸入完 commit message 之後,再輸入 ` wq ` ,就會看到下圖
1117+
1118+ ![ alt tag] ( https://i.imgur.com/rA8wMbO.png )
1119+
1120+ 最後,再觀看 log,
1121+
1122+ ![ alt tag] ( https://i.imgur.com/lEP648c.png )
1123+
1124+ 我們成功將我們要的 commit merge 到我們的 master 分支上了:kissing_smiling_eyes :
1125+
1126+ 想了解更多的使用方法,可參考官方文件
1127+ [ https://git-scm.com/docs/git-cherry-pick ] ( https://git-scm.com/docs/git-cherry-pick ) 。
1128+
10221129## git revert
10231130
10241131假設我 commit history 為 A1 -> A2 -> A3 -> A4 -> A5 -> A6
0 commit comments