git cherry-pick 命令用于將指定的提交(commit)應(yīng)用于其他分支。
對于多分支的代碼庫,將代碼從一個分支轉(zhuǎn)移到另一個分支是常見需求。
這時分兩種情況。一種情況是,你需要另一個分支的所有代碼變動,那么就采用合并(git merge)。另一種情況是,你只需要部分代碼變動(某幾個提交),這時可以采用 git cherry-pick。
git cherry-pick <commitHash>
上面命令就會將指定的提交 commitHash,應(yīng)用于當前分支。這會在當前分支產(chǎn)生一個新的提交,當然它們的哈希值會不一樣。
舉例來說,代碼倉庫有 master 和 feature 兩個分支。
a - b - c - d Master \ e - f - g Feature
現(xiàn)在將提交 f 應(yīng)用到 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 命令的參數(shù),不一定是提交的哈希值,分支名也是可以的,表示轉(zhuǎn)移該分支的最新提交。
$ git cherry-pick feature
上面代碼表示將feature分支的最近一次提交,轉(zhuǎn)移到當前分支。
Cherry pick 支持一次轉(zhuǎn)移多個提交。
$ git cherry-pick <HashA> <HashB>
上面的命令將 A 和 B 兩個提交應(yīng)用到當前分支。這會在當前分支生成兩個對應(yīng)的新提交。
如果想要轉(zhuǎn)移一系列的連續(xù)提交,可以使用下面的簡便語法。
$ git cherry-pick A..B
上面的命令可以轉(zhuǎn)移從 A 到 B 的所有提交。它們必須按照正確的順序放置:提交 A 必須早于提交 B,否則命令將失敗,但不會報錯。
注意,使用上面的命令,提交 A 將不會包含在 Cherry pick 中。如果要包含提交 A,可以使用下面的語法。
$ git cherry-pick A^..B
git cherry-pick命令的常用配置項如下。
$ git cherry-pick -m 1 <commitHash>
上面命令表示,Cherry pick 采用提交commitHash來自編號1的父分支的變動。
一般來說,1號父分支是接受變動的分支(the branch being merged into),2號父分支是作為變動來源的分支(the branch being merged from)。
如果操作過程中發(fā)生代碼沖突,Cherry pick 會停下來,讓用戶決定如何繼續(xù)操作。
$ git cherry-pick --continue
Cherry pick 也支持轉(zhuǎn)移另一個代碼庫的提交,方法是先將該庫加為遠程倉庫。
$ git remote add target git://gitUrl
上面命令添加了一個遠程倉庫 target。然后,將遠程代碼抓取到本地。
$ git fetch target
上面命令將遠程代碼倉庫抓取到本地。
接著,檢查一下要從遠程倉庫轉(zhuǎn)移的提交,獲取它的哈希值。
$ git log target/master
最后,使用git cherry-pick命令轉(zhuǎn)移提交。
$ git cherry-pick <commitHash>