詳解 git cherry pick用法

2021-10-16 22:10:52 字數 3605 閱讀 5523

對於多分支的**庫,將**從乙個分支轉移到另乙個分支是常見需求。

這時分兩種情況。

你需要另乙個分支的所有**變動,那麼就採用合併(git merge)。

你只需要部分**變動(某幾個提交),這時可以採用 cherry pick。

cherry pick直譯為撿櫻桃?,它的功能是把已經存在的commit進行挑選,然後重新提交。比較合適的乙個場景是把a分支的某次或者多次的提交也提交到b分支上,使用方法

先切換到 a 分支

$ git checkout a
找到這次提交

$ git log

commit f038d7ffb1685af7d4f870ad0b798670b6f760e8 (head -> feature/0113_update)

author: qxj

date: thu jan 14 15:24:54 2021 +0800

feat: ***

再切換到b分支

$ git checkout b
把 a 分支下的這次commit 重新提交到 b 分支下

$ git cherry-pick 'f038d7ffb1685af7d4f870ad0b798670b6f760e8'
當執行完git cherry-pick以後,將會生成乙個新的提交,這個新的提交的hash值和原來的不同,但標誌名稱一樣。

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

$ git cherry-pick 

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

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

$ git cherry-pick a..b
上面的命令可以轉移從 a 到 b 的(**左開右閉,不包含a)**所有提交。它們必須按照正確的順序放置:提交 a 必須早於提交 b,否則命令將失敗,但不會報錯。

如果要包含提交 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 的過程**現了衝突

automatic cherry-pick failed.

after resolving the conflicts,mark the corrected paths with 'git add ' or 'git rm 'and commit the result with:

git commit -c 15a2b6c61927e5aed6111de89ad9dafba939a90b

// **或者:**

hint: after resolving the conflicts, mark the corrected paths

hint: with 'git add ' or 'git rm '

hint: and commit the result with 'git commit'

就跟普通的衝突一樣,手工解決。

$ git status    # 看哪些檔案出現衝突

$ vim ***.js # 手動解決它。

$ git add ***.js

or$ git add .

# 新增到快取區

$ git commit -c 新的commit號

然後再git cherry-pick剩餘的commit

error: a cherry-pick or revert is already in progress

hint: try "git cherry-pick (--continue | --quit | --abort)"

fatal: cherry-pick failed

則執行對應操作:

$ git cherry-pick --continue

$ git cherry-pick --quit

$ git cherry-pick --abort

記錄:

git cherry pick使用詳解

cherry pick 和它的名稱一樣,精心挑選,挑選乙個我們需要的 commit 進行操作。它可以用於將在其他分支上的 commit 修改,移植到當前的分支。想在某個穩定版本上,新增乙個剛開發完成的版本中的功能。就可以使用 cherry pick 命令,將這個功能相關的 commit 提取出來,合...

git cherry pick使用小記

cherry pick,顧名思義 摘櫻桃。如果說每一次commit是一顆櫻桃,那麼你可以通過cherry pick命令將這一顆櫻桃採摘到另外一顆櫻桃樹 branch 上。通常使用方式有如下兩種 1 git cherry pick 997367b commit id commit id可通過git l...

git cherry pick改寫提交

教程3 改寫提交!為了節省時間,這個教程使用現有的歷史記錄作為本地資料庫。我們進入stepup tutorial tutorial4目錄。本地端歷史記錄的狀態如下圖顯示。僅把在其他分支執行的 新增commit的講解 的修改匯入到master分支。git checkout master switche...