一、使用方法及其做用git
git cherry-pick能夠選擇某一個分支中的一個或幾個commit(s)來進行操做(操做的對象是commit)。例如,假設咱們有個穩定版本的分支,叫v2.0,另外還有個開發版本的分支v3.0,咱們不能直接把兩個分支合併,這樣會致使穩定版本混亂,可是又想增長一個v3.0中的功能到v2.0中,這裏就可使用cherry-pick了。web
就是對已經存在的commit 進行 再次提交;app
使用方法以下:ui
git cherry-pick <commit id>
查詢commit id 的查詢可使用git log查詢(查詢版本的歷史),最簡單的語法以下:spa
git log
詳細的git log 語法以下:3d
git log [<options>] [<since>..<until>] [[--] <path>...]code
主要參數選項以下:對象
-p:按補丁顯示每一個更新間的差別blog
--stat:顯示每次更新的修改文件的統計信息開發
--shortstat:只顯示--stat中最後的行數添加修改刪除統計
--name-only:盡在已修改的提交信息後顯示文件清單
--name-status:顯示新增、修改和刪除的文件清單
--abbrev-commit:僅顯示SHA-1的前幾個字符,而非全部的40個字符
--relative-date:使用較短的相對時間顯示(例如:"two weeks ago")
--graph:顯示ASCII圖形表示的分支合併歷史
--pretty:使用其餘格式顯示歷史提交信息
結果大概以下:
commit 0771a0c107dbf4c96806d22bbc6ef4c58dfe7075 Author: zhengcanrui <zhengcanrui@cvte.com> Date: Mon Aug 8 14:41:54 2016 +0800 [modify] [what] commit的備註信息
其中0771a0c107dbf4c96806d22bbc6ef4c58dfe7075就是咱們的commit id
注意:當執行完 cherry-pick 之後,將會 生成一個新的提交;這個新的提交的哈希值和原來的不一樣,但標識名 同樣;(commit id會變)
二、實踐
首先切換到你要添加commit的分支,如:你要將A分支上面的commit添加到B分支上面,咱們能夠要先切換到B分支上面。(注意:cherry-pick是一個本地的操做,假如你pull代碼以後有人在A分支上有了新的commit,須要你先pull代碼在進行cherry-pick,緣由及其錯誤提示請見最後)。
git checkout B
將0771a0c107dbf4c96806d22bbc6ef4c58dfe7075這個commit(提交)合併到B分支上面。正常狀況下,能夠給出所有的commit id,也能夠只給出前面的一段,只要你提交中沒有這一段重複的就好,剩下的部分git會幫你填充。
git cherry-pick 0771a0c107dbf4c #將上面的commit id爲0771a0c107dbf4c96806d22bbc6ef4c58dfe7075的提交添加到B分支上面
1.成功的狀況
順利的話,出現下面的狀況證實你已經成功了
Finished one cherry-pick. # On branch B # Your branch is ahead of 'origin/B' by 1 commits.
2.有衝突的狀況
下面是有文件衝突,和15a2b6c61927e5aed6718de89ad9dafba939a90b這個提交衝突
Automatic cherry-pick failed. After resolving the conflicts, mark the corrected paths with 'git add <paths>' or 'git rm <paths>' and commit the result with: git commit -c 15a2b6c61927e5aed6718de89ad9dafba939a90b
解決的衝突的方法也和普通的同樣,手工檢查。
1)查看衝突的文件
使用git status
both modified: app/models/user.rb
2)打開上面的那個文件,解決衝突。 執行add命令、執行commit命令,最後在提交便可了
三、遇到的一些錯誤
使用下面cherry-pick命令執行某個commit (編號爲:77c6905dcf7f946cff594a69a33d12e22bedfae4)
git cherry-pick 77c6905dcf7f946cff594a69a33d12e22bedfae4
出現了以下的錯誤:
fatal: bad object 77c6905dcf7f946cff594a69a33d12e22bedfae4
場景及出現錯誤的緣由:
個人狀況是在B分支的同步A分支的一個commit,出現瞭如標題的錯誤。我是直接在web上看到A分支新提交的這個commit,而後我直接在本地的B分支中進行git cherry-pick xxx。就出現了這個問題。通過嘗試問題是出在了我沒有切到B分支pull一下。總結過來就是git cherry-pick是本地特性,本地要有這個commit才能夠被git cherry-pick。
致謝:感謝您的閱讀!有錯誤請加以糾正,有其餘欠缺的東西請不吝賜教,謝謝!
ps:接外包開發