git cherry-pick適用場景詳解


前提條件:有2個分支,分別是master,hotfix,其中master是用於生產環境的發布分支。

場景1:生產環境hotfix。

T1時刻,使用master分支發布生產。當時的HEAD的commit記為C1.

T2時刻,開發完成下一個迭代周期的代碼,並且merge到master准備提測,此時master的HEAD記為C2,注意:C1和C2已經不同了。

T3時刻,生產環境發現了bug,開發基於C1創建一個hotfix分支,代碼緊急修復並簽入hotfix,用C3表示這個commit,發布生產。

問題:由於hotfix不能基於C2創建(T2時master已污染,存在下一周期待提測代碼),如何確保C3被正確merge到master呢?

答案:使用git cherry-pick命令。

git checkout dev // 每個開發人員有自己的dev分支,這個分支基於master創建,時刻和master同步

git cherry-pick -n C3   //C3是hotfix的提交sha-1

git commit -am "把hotfix(C3)的代碼cherry-pick到master"

git push origin dev

最后,去gitlab里發起一個MergeRequest吧,dev->master。

 

場景2:某一個產品有3個分支,master,feture1,feture2。其中,

master是基礎功能,覆蓋全體用戶;

feature1包括中級功能,覆蓋一部分用戶;

feature2包括高級功能,覆蓋另一部分用戶;

由於業務領域的特征,這3個分支一直並行存在,feature1和feature2永遠不會回歸主線master。

T1時刻,feature1新增了5個功能(commit),分別記錄為F1、F2、F3、F4,F5; 假定這5個commit是順序提交的。

T2時刻,決定把F1、F2、F3的這3個功能開放給所有用戶。

問題:如何在feature1分支中挑選需要的功能,並最終合並到master呢?

答案:使用git cherry-pick命令。

git checkout dev // 每個開發人員有自己的dev分支,這個分支基於master創建,時刻和master同步

方法1:git cherry-pick -n F1~1..F3  // 注意:commit區間(左開右閉],因此第1個參數要設置成F1~1(F1的上一次提交),這樣才能把F1也包含進去。

方法2:依次執行3條命令,

git cherry-pick -n F1

git cherry-pick -n F2

git cherry-pick -n F3

git commit -am "F1、F2、F3的代碼cherry-pick到master"

git push origin dev

最后,去gitlab里發起一個MergeRequest吧,dev->master。

 

注意:

若cherry-pick期間發生沖突,先解決沖突,再commit。

若cherry-pick命令執行后提示:

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   // 繼續cherry-pick
git cherry-pick --quit  // 退出
git cherry-pick --abort // 中止

 


免責聲明!

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



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