首頁 > 軟體

git cherry-pick合併某個commit

2020-06-16 16:40:43

1、使用方法及其作用

  git cherry-pick可以選擇某一個分支中的一個或幾個commit(s)來進行操作(操作的物件是commit)。例如,假設我們有個穩定版本的分支,叫v2.0,另外還有個開發版本的分支v3.0,我們不能直接把兩個分支合併,這樣會導致穩定版本混亂,但是又想增加一個v3.0中的功能到v2.0中,這裡就可以使用cherry-pick了。

  就是對已經存在的commit 進行 再次提交;

使用方法如下:

git cherry-pick <commit id>

查詢commit id 的查詢可以使用git log查詢(查詢版本的歷史),最簡單的語法如下:

git log

詳細的git log 語法如下:

  git log [<options>] [<since>..<until>] [[--] <path>...]

      主要引數選項如下:

            -p:按修補程式顯示每個更新間的差異

            --stat:顯示每次更新的修改檔案的統計資訊

            --shortstat:只顯示--stat中最後的行數新增修改刪除統計

            --name-only:盡在已修改的提交資訊後顯示檔案清單

            --name-status:顯示新增、修改和刪除的檔案清單

            --abbrev-commit:僅顯示SHA-1的前幾個字元,而非所有的40個字元

            --relative-date:使用較短的相對時間顯示(例如:"two weeks ago")

            --graph:顯示ASCII圖形表示的分支合併歷史

            --pretty:使用其他格式顯示歷史提交資訊

結果大概如下:

commit 0771a0c107dbf4c96806d22bbc6ef4c58dfe7075
Author: zhengcanrui <linux@linuxidc.com>
Date:  Mon Aug 8 14:41:54 2016 +0800

    [modify] [what] commit的備註資訊

  其中0771a0c107dbf4c96806d22bbc6ef4c58dfe7075就是我們的commit id

  注意:當執行完 cherry-pick 以後,將會 生成一個新的提交;這個新的提交的雜湊值和原來的不同,但標識名 一樣;(commit id會變)

2、實踐

  首先切換到你要新增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命令,最後在提交即可了

3、遇到的一些錯誤

  使用下面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。


IT145.com E-mail:sddin#qq.com