Skip to content

Commit 138c078

Browse files
committed
add git-cherry-pick tutorial
1 parent aa5ac25 commit 138c078

File tree

1 file changed

+107
-0
lines changed

1 file changed

+107
-0
lines changed

README.md

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)