Git用cherrypick挑好看的小櫻桃

NO IMAGE

前篇

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

具體的做法:

  1. 切換到 develop 分支。
  2. 通過 git log feature,找到 C 的 SHA1 值。
  3. 通過 git cherry-pick <C的SHA1> ,將 C 的修改內容合併到當前內容分支 develop 中。
  4. 若無衝突,過程就已經完成了。如果有衝突,按正常衝突解決流程即可。
Git用cherrypick挑好看的小櫻桃

cherry-pick VS merge, Ready? GO!

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

Git用cherrypick挑好看的小櫻桃
Git用cherrypick挑好看的小櫻桃

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

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

例中,提交 C 的內容,就是對比 B 上面做的修改,可能是創建了一個文件,或者修改了一個詞語。那麼 C 內容就是一個文件的添加,和一個詞語的修改。

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

cherry-pick 操作的對象就是 commit。
merge 操作的對象就是 commit history。

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

博主邀請你參加挑櫻桃遊戲

光說不練假把式,現在寫個小 demo 測試一下。

  1. 創建一個空文件夾 GitDemo,git init初始化。
  2. 隨便創建一個文件,完成初次提交,創建 master 分支。
  3. 創建並切換 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號文件"

以上,測試場景構建完畢。現在用 git log develop 查看 develop 的提交歷史如下:

Git用cherrypick挑好看的小櫻桃

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

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

Git用cherrypick挑好看的小櫻桃

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

Git用cherrypick挑好看的小櫻桃

挑櫻桃遊戲成功!

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

Git用cherrypick挑好看的小櫻桃

瞭解更多的 cherry-pick

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

git cherry-pick <commits>

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

git cherry-pick <start-commit>..<end-commit>

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

git cherry-pick <start-commit>^..<end-commit>

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

git cherry-pick <branch name>

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

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

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

尾篇

對於這個命令來說,理解 commit 的本質是修改很關鍵。好了,下篇博客見~


Git用cherrypick挑好看的小櫻桃

歡迎關注博主的微信公眾號,快快加入哦,期待與你一起成長!

相關文章

Git移動記錄儀&貼心小棉襖reflog

Git少年,你想學回滾嗎?想撤銷文件修改嗎?

Gitrebase黑魔法之打磨commit顆粒度

Gitrebase黑魔法之打造完美的線性歷史