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

前篇

在此之前思灰,我想問一個問題玷犹,你是在接觸 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!

具體的做法:

  1. 切換到 develop 分支歹啼。
  2. 通過 git log feature,找到 C 的 SHA1 值玄渗。
  3. 通過 git cherry-pick <C的SHA1> ,將 C 的修改內(nèi)容合并到當(dāng)前內(nèi)容分支 develop 中狸眼。
  4. 若無沖突藤树,過程就已經(jīng)完成了。如果有沖突拓萌,按正常沖突解決流程即可岁钓。
cherry-pick 示意圖

cherry-pick VS merge, Ready? GO!

從上面簡單的小例子上看,我想微王,小伙伴們屡限,都應(yīng)該已經(jīng)對 merge 和 cherry-pick 有了大概的區(qū)分,這里做下對比炕倘,讓大家有個清晰明確的掌握钧大,防止似是而非,以后誤操作罩旋。

image

image

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 測試一下询张。

  1. 創(chuàng)建一個空文件夾 GitDemo,git init初始化孙乖。
  2. 隨便創(chuàng)建一個文件,完成初次提交份氧,創(chuàng)建 master 分支唯袄。
  3. 創(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 的提交歷史如下:

image

現(xiàn)在酪我,仔細(xì)瞅瞅消痛,你最喜歡幾號櫻桃,喜歡哪個都哭,就挑哪個秩伞。我喜歡3號,從上圖看到3號的 SHA1 值是9e2d49b7c6d868c4cac4c5198d6661837eca813b,使用前幾位就足夠了欺矫。

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

image

挑選成功纱新,通過 ls 命令,看到成功加入櫻桃3號.txt穆趴。

image

挑櫻桃游戲成功脸爱!

另外,需要說明的是未妹,cherry-pick 到 master 的櫻桃3號簿废,事實上不是真的 3 號,是 3 號的復(fù)制品络它, 兩者的 SHA1 值是不同的族檬,由此可確認(rèn)這是兩個提交。

image

了解更多的 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)鍵煮嫌。好了,下篇博客見~


歡迎關(guān)注博主的微信公眾號抱虐,快快加入哦昌阿,期待與你一起成長!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梯码,一起剝皮案震驚了整個濱河市宝泵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌轩娶,老刑警劉巖儿奶,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鳄抒,居然都是意外死亡闯捎,警方通過查閱死者的電腦和手機(jī)椰弊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓤鼻,“玉大人秉版,你說我怎么就攤上這事〔绲唬” “怎么了清焕?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵橄唬,是天一觀的道長诱桂。 經(jīng)常有香客問我,道長榆芦,這世上最難降的妖魔是什么沃粗? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任粥惧,我火速辦了婚禮,結(jié)果婚禮上最盅,老公的妹妹穿的比我還像新娘突雪。我一直安慰自己,他們只是感情好涡贱,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布咏删。 她就那樣靜靜地躺著,像睡著了一般盼产。 火紅的嫁衣襯著肌膚如雪饵婆。 梳的紋絲不亂的頭發(fā)上勺馆,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天戏售,我揣著相機(jī)與錄音,去河邊找鬼草穆。 笑死灌灾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的悲柱。 我是一名探鬼主播锋喜,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼豌鸡!你這毒婦竟也來了嘿般?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤涯冠,失蹤者是張志新(化名)和其女友劉穎炉奴,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛇更,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瞻赶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年赛糟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砸逊。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡璧南,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出师逸,到底是詐尸還是另有隱情司倚,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布篓像,位于F島的核電站对湃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏遗淳。R本人自食惡果不足惜拍柒,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屈暗。 院中可真熱鬧拆讯,春花似錦、人聲如沸养叛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弃甥。三九已至爽室,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間淆攻,已是汗流浹背阔墩。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留瓶珊,地道東北人啸箫。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像伞芹,于是被迫代替她去往敵國和親忘苛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1唱较,查看所有遠(yuǎn)程分支:%git branch -r 2, 拉取遠(yuǎn)程分支并創(chuàng)建本地分支git checkout -...
    will666閱讀 2,069評論 0 18
  • git常用命令 GIT常用命令備忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章閱讀 8,486評論 1 26
  • 在許許多多父母眼中扎唾,在許許多多高三孩子眼中,“陪伴”或許很重要南缓,但我認(rèn)為其意義的理解各不相同胸遇。因為生活的轱轆在前行...
    淡若止水坊閱讀 586評論 6 8