git cherry-pick 簡單教程

git cherry-pick 簡單教程

在上一篇文章說以為某些原因,我趁著下班前的功夫簡單寫了份規範文件,裡面就提到使用cherry-pick 這個命令。

cherry-pick是一個可以提高開發效率的命令。

cherry-pick可以把其它分支上的commit一個個抽離出來,合併到指定分支上。

一、基本用法

git cherry-pick命令的作用,就是將指定的提交(commit)應用於其他分支。

$ git cherry-pick

上面命令就會將指定的提交commitHash,應用於當前分支。這會在當前分支產生一個新的提交,當然它們的雜湊值會不一樣。

舉例來說,程式碼倉庫有master和feature兩個分支。

a - b - c - d Master \ e - f - g Feature

現在將提交f應用到master分支。

# 切換到 master 分支$ git checkout master# Cherry pick 操作$ git cherry-pick f

上面的操作完成以後,程式碼庫就變成了下面的樣子。

a - b - c - d - f Master \ e - f - g Feature

從上面可以看到,master分支的末尾增加了一個提交f。

git cherry-pick命令的引數,不一定是提交的雜湊值,分支名也是可以的,表示轉移該分支的最新提交。

$ git cherry-pick feature

上面程式碼表示將feature分支的最近一次提交,轉移到當前分支。

二、轉移多個提交

Cherry pick 支援一次轉移多個提交。

$ git cherry-pick

上面的命令將 A 和 B 兩個提交應用到當前分支。這會在當前分支生成兩個對應的新提交。

如果想要轉移一系列的連續提交,可以使用下面的簡便語法。

$ git cherry-pick A。。B

上面的命令可以轉移從 A 到 B 的所有提交。它們必須按照正確的順序放置:提交 A 必須早於提交 B,否則命令將失敗,但不會報錯。

注意,使用上面的命令,提交 A 將不會包含在 Cherry pick 中。如果要包含提交 A,可以使用下面的語法。

$ git cherry-pick A^。。B

三、配置項

git cherry-pick命令的常用配置項如下。

(1)-e,——edit

開啟外部編輯器,編輯提交資訊。

(2)-n,——no-commit

只更新工作區和暫存區,不產生新的提交。

(3)-x

在提交資訊的末尾追加一行(cherry picked from commit 。。。),方便以後查到這個提交是如何產生的。

(4)-s,——signoff

在提交資訊的末尾追加一行操作者的簽名,表示是誰進行了這個操作。

(5)-m parent-number,——mainline parent-number

如果原始提交是一個合併節點,來自於兩個分支的合併,那麼 Cherry pick 預設將失敗,因為它不知道應該採用哪個分支的程式碼變動。

-m配置項告訴 Git,應該採用哪個分支的變動。它的引數parent-number是一個從1開始的整數,代表原始提交的父分支編號。

$ git cherry-pick -m 1

上面命令表示,Cherry pick 採用提交commitHash來自編號1的父分支的變動。

一般來說,1號父分支是接受變動的分支(the branch being merged into),2號父分支是作為變動來源的分支(the branch being merged from)。

四、程式碼衝突

如果操作過程中發生程式碼衝突,Cherry pick 會停下來,讓使用者決定如何繼續操作。

(1)——continue

使用者解決程式碼衝突後,第一步將修改的檔案重新加入暫存區(git add 。),第二步使用下面的命令,讓 Cherry pick 過程繼續執行。

$ git cherry-pick ——continue

(2)——abort

發生程式碼衝突後,放棄合併,回到操作前的樣子。

(3)——quit

發生程式碼衝突後,退出 Cherry pick,但是不回到操作前的樣子。

五、轉移到另一個程式碼庫

Cherry pick 也支援轉移另一個程式碼庫的提交,方法是先將該庫加為遠端倉庫。

$ git remote add target git://gitUrl

上面命令添加了一個遠端倉庫target。

然後,將遠端程式碼抓取到本地。

$ git fetch target

上面命令將遠端程式碼倉庫抓取到本地。

接著,檢查一下要從遠端倉庫轉移的提交,獲取它的雜湊值。

$ git log target/master

最後,使用git cherry-pick命令轉移提交。

$ git cherry-pick

(完)

感謝原作者(阮一峰)

http://www。ruanyifeng。com/blog/2020/04/git-cherry-pick。html