今天要介紹的是cherry-pick指令
假設我們在branch cr1 上開發了好幾個功能,
結果客戶表示某些 cr1 內的功能要上線,其他的不上
所以要包一個測試的版本給客戶的話,要如何產生客戶想要的版本呢?
cherry-pick指令 應該就是我們要找的指令了
我們從master 開一個branch cr1
$ git checkout -b cr1
Switched to a new branch 'cr1'
在cr1上面改了4個cmooit,如下所示有4個div分別顯示cr1-1到cr1-4
每加一個 cr1-X 就commit一版
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>My Page</title>
</head>
<body>
<h1>momo's page lala edit</h1>
<div>learning git</div>
<div>change remote url</div>
<div>prepare</div>
<div>use the rebase</div>
<div>deBug deBug deBug</div>
<div>cr1-1</div>
<div>cr1-2</div>
<div>cr1-3</div>
<div>cr1-4</div>
</body>
</html>
此時cr1上面的線圖如下
這時候客戶說下次上線要測試的版本是只要上cr1-1,cr1-3的版本
這時候我們的範例最後的結果應該會是一個只有cr1-1,cr1-3出現在index.html內的版本
我們先在分支cr1上用git log來檢視commit的hash id為何
$ git log --pretty=format:"%h %s"
9a7345e cr1-4
fb808b6 cr1-3
e33aa75 cr1-2
0cb1ee7 cr1-1
接著切回master
這時候就可以從master 下指令了
不過我的習慣會是回到master後 會從剛才建立cr1的commit來建立一個uat或是test的分支
切換到該uat分支,先將cr1-1取出
$ git cherry-pick 0cb1ee7
[uat 34e6995] cr1-1
Date: Thu Dec 29 23:47:35 2016 +0800
1 file changed, 1 insertion(+)
此時分支uat線圖如下
接下來將cr1-3撿回來
$ git cherry-pick fb808b6
error: could not apply fb808b6... cr1-3
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
有衝突要合併
衝突的內容如下
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>My Page</title>
</head>
<body>
<h1>momo's page lala edit</h1>
<div>learning git</div>
<div>change remote url</div>
<div>prepare</div>
<div>use the rebase</div>
<div>deBug deBug deBug</div>
<div>cr1-1</div>
<<<<<<< HEAD
=======
<div>cr1-2</div>
<div>cr1-3</div>
>>>>>>> fb808b6... cr1-3
</body>
</html>
合併後應該是只會留下cr1-1以及cr1-3所做的異動
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>My Page</title>
</head>
<body>
<h1>momo's page lala edit</h1>
<div>learning git</div>
<div>change remote url</div>
<div>prepare</div>
<div>use the rebase</div>
<div>deBug deBug deBug</div>
<div>cr1-1</div>
<div>cr1-3</div>
</body>
</html>
衝突合併後就commit
$ git commit
[uat b245190] cr1-3
Date: Thu Dec 29 23:48:06 2016 +0800
1 file changed, 1 insertion(+)
此時index.html內就是客戶要的cr1-1加上cr1-3的版本
線圖如下
可以看到分支uat內,後面兩個commit就是我們利用cherry-pick指令撿回來的異動資料
這樣一來就可以對客戶交代了