前提條件:有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 // 中止