Git使用小技巧之挑揀合並


先想想一個情況,現在我們有一個功能急需要發布到線上,但是這個功能相關的代碼所在的測試分(test)支有很多不應該發布的代碼,那么這個時候我們就需要將與這個代碼相關的提交選擇性的合並到master上並發布。如果你還不知道git cherry-pick命令的話,很有可能你會從master分支上檢出一個新分支,然后在把相關的代碼copy到新分支上然后再合並回master。當然這么做確實可以達到最終的目的,但是手動copy很容易遺漏某些東西,那么我們這篇文章就來講解一下git cherry-pick命令。

准備

1.准備一個空的git倉庫,並創建一個readme文件然后提交。

mkdir git-test
cd git-test
git init
touch README.md
git add README.md
git commit -m "第一次提交"

2.基於master創建一個新的分支dev

git checkout -b dev

3.修改兩次README.md文件,並commit兩次。執行git log后我們會看到如下內容:

$ git log
commit cc04beabf0678f54bf64635bd56160c78b0aa1e6 (HEAD -> dev)
Author: 代碼無止境 <gancy.programmer@gmail.com>
Date:   Mon Jun 17 18:35:44 2019 +0800

    第三次提交

commit 32259aa35d0702d2d05c648938798f9a5bd4b9e7
Author: 代碼無止境 <gancy.programmer@gmail.com>
Date:   Mon Jun 17 18:35:23 2019 +0800

    第二次提交

commit e7f478807d478a0c3e0af8659e0733a9d5b32c8b (master)
Author: 代碼無止境 <gancy.programmer@gmail.com>
Date:   Mon Jun 17 18:34:09 2019 +0800

    第一次提交

git cherry-pick

經過上面的步驟一個git cherry-pick的使用場景就已經被我們模擬出來了。假如說我們現在dev上的第二次提交就是我們現在急需要發布的功能,那么我們就需要使用git cherry-pick命令將這次提交合並到master分支上。
1.在dev分支上執行git log命令,找到目標commit的commitid.
2.切換到master分支

git checkout master

3.執行git cherry-pick命令

git cherry-pick 32259aa35d0702d2d05c648938798f9a5bd4b9e7

4.再次執行git log命令就可以看到目標提交已經被合並到master上了

$ git log
commit 845d18e1193e4ad4361c8065173ed9b96fcc5227 (HEAD -> master)
Author: 代碼無止境 <gancy.programmer@gmail.com>
Date:   Mon Jun 17 18:35:23 2019 +0800

    第二次提交

commit e7f478807d478a0c3e0af8659e0733a9d5b32c8b
Author: 代碼無止境 <gancy.programmer@gmail.com>
Date:   Mon Jun 17 18:34:09 2019 +0800

    第一次提交

git cherry-pick 相關參數

上面只是git cherry-pick命令的簡單用法,其實這個命令還提供了不少的參數。

git cherry-pick [<options>] <commit-ish>...

常用options:
    --quit                退出當前的chery-pick序列
    --continue            繼續當前的chery-pick序列
    --abort               取消當前的chery-pick序列,恢復當前分支
    -n, --no-commit       不自動提交
    -e, --edit            編輯提交信息

如果我們執行git cherry-pick合並之后發生了沖突,這個時候Git會自動幫我們新建一個分支,如下所示:

MINGW64 ~/Desktop/p/write/筆記/git-test (master|CHERRY-PICKING)

如果我們想取消這次合並可以執行git cherry-pick --quit或者git cherry-pick --abort命令取消這次挑揀。
二者不同的地方在於前者會將當前分支中未沖突的內容狀態變為modified,
而后者則會直接將當前分支的內容回退到挑揀之前的狀態。當然如果我們也可以解決沖突之后執行如下命令繼續合並:

git add *
git cherry-pick --continue

后面的-n和-e,就比較容易理解了,-n就是挑揀后不會自動提交,需要我們執行git commit命令進行提交,而-e則是可以改變挑揀的message信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM