Git-用 cherry-pick 挑好看的小櫻桃

前篇
在此之前,我想問一個問題,你是在接觸 Git 多久之後,知道有這個命令的?

我的答案是很久很久之後,這真是一個悲傷的故事。懶,是萬惡之源,此話果然不假。

cherry-pick 能幹啥?
cherry,中文翻譯是櫻桃,pick, 中文翻譯是採集,挑選。所以,cherry-pick 就是挑選櫻桃,git cherry-pick 就是從你的專案檔案中找出"櫻桃"二字,找到就可以找博主來兌換櫻桃了。

以上是開玩笑,寫部落格呢,幹什麼,正經點!

cherry-pick 的翻譯是擇優挑選,使用git cherry-pick命令,可以選擇將現有的一個或者多個提交的修改引入當前內容。

那麼,什麼情況下會有到這麼不常見的命令呢?

假設你現在正在開發一個專案,有一個功能分支 feature,開發分支 develop。 feature 有3個提交,分別是 A ,B ,C 。develop 分支只想加入 C 功能, 此時合併操作無法滿足,因為直接合併 feature,會將3個提交都合併上,我想合併就衹有 C,不要 A,B。此時就需要挑櫻桃大法–cherry pick!

具體的做法:

切換到 develop 分支。
透過 git log feature,找到 C 的 SHA1 值。
透過 git cherry-pick ,將 C 的修改內容合併到當前內容分支 develop 中。
若無衝突,過程就已經完成了。如果有衝突,按正常衝突解決流程即可。

cherry-pick VS merge, Ready? GO!
從上面簡單的小範例上看,我想,小夥伴們,都應該已經對 merge 和 cherry-pick 有了大概的區分,這裡做下對比,讓大家有個清晰明確的掌握,防止似是而非,以後誤操作。

git merge :將兩個提交歷史合併。
git cherry-pick:將提交對應的內容合併。

這裡,非常需要明確的一點,commit 代表的是修改!

例中,提交 C 的內容,就是對比 B 上面做的修改,可能是建立了一個檔案,或者修改了一個詞語。那麼 C 內容就是一個檔案的新增,和一個詞語的修改。

以提交 C 為結束點的提交歷史,實際內容是提交 C 和 C 之前所有的修改。

cherry-pick 操作的物件就是 commit。
merge 操作的物件就是 commit history。

所以,使用的時候,你要知道,你想要的什麼。

博主邀請你參加挑櫻桃遊戲
光說不練假把式,現在寫個小 demo 測試一下。

建立一個空資料夾 GitDemo,git init初始化。
隨便建立一個檔案,完成初次提交,建立 master 分支。
建立並切換 develop 分支,建立個提交,每一個提交中建立一個檔案,方便測試。
具體命令如下:

// 切換到GitDemo目錄下,並初始化Git
cd .../GitDemo
git init

//建立初次提交,建立 master 分支
touch cherry-pick.txt
git add .
git commit -m '建立cherry-pick檔案,初次提交'

//建立並切換到 develop 分支,建立提交「櫻桃1號」
git checkout -b develop
touch 櫻桃1號.txt
git add .
git commit -m "建立櫻桃1號檔案"

//建立提交「櫻桃2號」
touch 櫻桃2號.txt
git add .
git commit -m "建立櫻桃2號檔案"

//建立提交「櫻桃3號」
touch 櫻桃3號.txt
git add .
git commit -m "建立櫻桃3號檔案"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
以上,測試場景構建完畢。現在用 git log develop 檢視 develop 的提交歷史如下:

現在,仔細瞅瞅,你最喜歡幾號櫻桃,喜歡哪個,就挑哪個。我喜歡3號,從上圖看到3號的 SHA1 值是90279a36a8972034e922b65598adfc0c3e13679b,使用前幾位就足夠了。

//切換到 master 分支
git checkout master
//挑選3號櫻桃
git cherry-pick 90279a36

1
2
3
4
5

挑選成功,透過 ls 命令,看到成功加入櫻桃3號.txt。

挑櫻桃遊戲成功!

另外,需要說明的是,cherry-pick 到 master 的櫻桃3號,事實上不是真的 3 號,是 3 號的複製品, 兩者的 SHA1 值是不同的,由此可確認這是兩個提交。

了解更多的 cherry-pick
理解 cherry-pick 操作的本質,之後,再看其他的命令,就毫無壓力了。全部命令詳看官方檔案,這裡我給出幾個比較常用的:

git cherry-pick

1
2
挑選多個提交合併,提交之間用空白相隔。例如,想挑選1號和3號的,就可以用git cherry-pick 4d2951 e4cdff9命令一步到位了。

git cherry-pick ..

1
2
挑選一個範圍的多個提交合併,但是這個語法對應操作區別是左開右閉,不包含start-commit。另外要注意兩個commit 之間要求有連續關係的,並且前者要在後者之前,順序不能顛倒。

git cherry-pick ^..

1
2
這個和上面一樣,區別就是加了一個^符號,就變成閉區間了,包含 start-commit。

git cherry-pick
1
挑選 branch 最頂端的提交。例如挑選 3 號櫻桃可以用git cherry-pick develop。

git cherry-pick --continue //繼續下個操作
git cherry-pick --quit //退出
git cherry-pick --abort //停止本次操作

1
2
3
4
以上是關於 cherry-pick 操作控制命令,當 cherry-pick 多個提交時,假設遇到衝突,--continue繼續進行下個,--quit結束 cherry-pick 操作,但是不會影響衝突之前多個提交中已經成功的,--abort直接打回原形,回到 cherry-pick 前的狀態,包括多個提交中已經成功的。

尾篇
對於這個命令來說,理解 commit 的本質是修改很關鍵。好了,下篇部落格見~,這個3月要將當初計劃的 Git 系列部落格補完,Fighting!
————————————————
版權宣告:本文為CSDN博主「DRPrincess」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/qq_32452623/article/details/79449534