前篇
在此之前思灰,我想問一個問題玷犹,你是在接觸 Git 多久之后,知道有這個命令的官辈?
我的答案是很久很久之后,這真是一個悲傷的故事遍坟。懶拳亿,是萬惡之源,此話果然不假愿伴。
cherry-pick 能干啥肺魁?
cherry,中文翻譯是櫻桃隔节,pick鹅经, 中文翻譯是采集,挑選怎诫。所以瘾晃,cherry-pick 就是挑選櫻桃,git cherry-pick
就是從你的項目文件中找出"櫻桃"二字,找到就可以找博主來兌換櫻桃了幻妓。
以上是開玩笑蹦误,寫博客呢,干什么肉津,正經(jīng)點强胰!
cherry-pick 的翻譯是擇優(yōu)挑選,使用git cherry-pick
命令妹沙,可以選擇將現(xiàn)有的一個或者多個提交的修改引入當(dāng)前內(nèi)容偶洋。
那么,什么情況下會有到這么不常見的命令呢距糖?
假設(shè)你現(xiàn)在正在開發(fā)一個項目玄窝,有一個功能分支 feature,開發(fā)分支 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的SHA1>
,將 C 的修改內(nèi)容合并到當(dāng)前內(nèi)容分支 develop 中狸眼。 - 若無沖突藤树,過程就已經(jīng)完成了。如果有沖突拓萌,按正常沖突解決流程即可岁钓。
cherry-pick VS merge, Ready? GO!
從上面簡單的小例子上看,我想微王,小伙伴們屡限,都應(yīng)該已經(jīng)對 merge 和 cherry-pick 有了大概的區(qū)分,這里做下對比炕倘,讓大家有個清晰明確的掌握钧大,防止似是而非,以后誤操作罩旋。
git merge
:將兩個提交歷史合并拓型。
git cherry-pick
:將提交對應(yīng)的內(nèi)容合并。
這里瘸恼,非常需要明確的一點劣挫,commit 代表的是修改!
例中东帅,提交 C 的內(nèi)容压固,就是對比 B 上面做的修改,可能是創(chuàng)建了一個文件靠闭,或者修改了一個詞語帐我。那么 C 內(nèi)容就是一個文件的添加,和一個詞語的修改愧膀。
以提交 C 為結(jié)束點的提交歷史拦键,實際內(nèi)容是提交 C 和 C 之前所有的修改。
cherry-pick 操作的對象就是 commit檩淋。
merge 操作的對象就是 commit history芬为。
所以萄金,使用的時候,你要知道媚朦,你想要的什么氧敢。
博主邀請你參加挑櫻桃游戲
光說不練假把式,現(xiàn)在寫個小 demo 測試一下询张。
- 創(chuàng)建一個空文件夾 GitDemo,
git init
初始化孙乖。 - 隨便創(chuàng)建一個文件,完成初次提交份氧,創(chuàng)建 master 分支唯袄。
- 創(chuàng)建并切換 develop 分支,創(chuàng)建個提交蜗帜,每一個提交中創(chuàng)建一個文件恋拷,方便測試。
具體命令如下:
// 切換到GitDemo目錄下,并初始化Git
cd .../GitDemo
git init
//創(chuàng)建初次提交钮糖,創(chuàng)建 master 分支
touch cherry-pick.txt
git add .
git commit -m '創(chuàng)建cherry-pick文件梅掠,初次提交'
//創(chuàng)建并切換到 develop 分支酌住,創(chuàng)建提交“櫻桃1號”
git checkout -b develop
touch 櫻桃1號.txt
git add .
git commit -m "創(chuàng)建櫻桃1號文件"
//創(chuàng)建提交“櫻桃2號”
touch 櫻桃2號.txt
git add .
git commit -m "創(chuàng)建櫻桃2號文件"
//創(chuàng)建提交“櫻桃3號”
touch 櫻桃3號.txt
git add .
git commit -m "創(chuàng)建櫻桃3號文件"
以上店归,測試場景構(gòu)建完畢。現(xiàn)在用 git log develop
查看 develop 的提交歷史如下:
現(xiàn)在酪我,仔細(xì)瞅瞅消痛,你最喜歡幾號櫻桃,喜歡哪個都哭,就挑哪個秩伞。我喜歡3號,從上圖看到3號的 SHA1 值是9e2d49b7c6d868c4cac4c5198d6661837eca813b
,使用前幾位就足夠了欺矫。
//切換到 master 分支
git checkout master
//挑選3號櫻桃
git cherry-pick 9e2d49b
挑選成功纱新,通過 ls
命令,看到成功加入櫻桃3號.txt
穆趴。
挑櫻桃游戲成功脸爱!
另外,需要說明的是未妹,cherry-pick 到 master 的櫻桃3號簿废,事實上不是真的 3 號,是 3 號的復(fù)制品络它, 兩者的 SHA1 值是不同的族檬,由此可確認(rèn)這是兩個提交。
了解更多的 cherry-pick
理解 cherry-pick 操作的本質(zhì)化戳,之后单料,再看其他的命令,就毫無壓力了。全部命令詳看官方文檔看尼,這里我給出幾個比較常用的:
git cherry-pick <commits>
挑選多個提交合并,提交之間用空格相隔递鹉。例如,想挑選1號和3號的藏斩,就可以用git cherry-pick 4d2951 e4cdff9
命令一步到位了躏结。
git cherry-pick <start-commit>..<end-commit>
挑選一個范圍的多個提交合并,但是這個語法對應(yīng)操作區(qū)別是左開右閉,不包含start-commit狰域。另外要注意兩個commit 之間要求有連續(xù)關(guān)系的媳拴,并且前者要在后者之前,順序不能顛倒兆览。
git cherry-pick <start-commit>^..<end-commit>
這個和上面一樣屈溉,區(qū)別就是加了一個^
符號,就變成閉區(qū)間了抬探,包含 start-commit子巾。
git cherry-pick <branch name>
挑選 branch 最頂端的提交。例如挑選 3 號櫻桃可以用git cherry-pick develop
小压。
git cherry-pick --continue //繼續(xù)下個操作
git cherry-pick --quit //退出
git cherry-pick --abort //停止本次操作
以上是關(guān)于 cherry-pick 操作控制命令线梗,當(dāng) cherry-pick 多個提交時,假設(shè)遇到?jīng)_突怠益,--continue
繼續(xù)進(jìn)行下個仪搔,--quit
結(jié)束 cherry-pick 操作,但是不會影響沖突之前多個提交中已經(jīng)成功的,--abort
直接打回原形蜻牢,回到 cherry-pick 前的狀態(tài)烤咧,包括多個提交中已經(jīng)成功的。
尾篇
對于這個命令來說抢呆,理解 commit 的本質(zhì)是修改很關(guān)鍵煮嫌。好了,下篇博客見~