Cherry-Pick | 一日一 Git

承香墨影發表於2019-03-04

版權宣告:

本賬號釋出文章均來自公眾號,承香墨影(cxmyDev),版權歸承香墨影所有。

未經允許,不得轉載。

一、前言

在實際工作開發中,會遵循標準的 Git Work flow,對待不同的功能,會切出不同的分支進行 coding,所以,基於什麼基準分支切出來的功能分支進行 coding,這是一個很重要的問題。

如果切錯了基準分支,你會發現可能最終開發完成之後, merge 不回去了。或者需要將某個分支上的 commit 程式碼,移植到某個分支上面,就需要使用到 cherry-pick 這個 git 命令了。

二、Git 的 Cherry-Pick

1、什麼是 Cherry-Pick

cherry-pick 是 Git 版本控制工具中的一個命令,和 commit 、pull 一樣,它只是一個命令。

cherry-pick 和它的名稱一樣,精心挑選,挑選一個我們需要的 commit 進行操作。它可以用於將在其他分支上的 commit 修改,移植到當前的分支。

一個很常見的場景,就是想在某個穩定版本上,新增一個剛開發完成的版本中的功能。就可以使用 Cherry-pick 命令,將這個功能相關的 commit 提取出來,合入穩定版本的分支上。

2、如何使用 Cherry-Pick

Cherry-Pick 使用起來非常的簡單:

git cherry-pick <commit-id>

這裡操作的就是需要 cherry-pick 的 commit-id ,一般使用 Git 管理工具什麼的,都可以很方便的檢視到,否者的話,可以使用 git log 命令,查詢我們需要的 commit-id。

當執行完 cherry-pick 之後,將會自動生成一個新的 commit 進行提交,也就是會有一個新的 commit ID。

如果順利的話,就可以正常提交了。如果遇到衝突,使用 git diff 解決衝突即可,工作中,不推薦手工解決衝突,最好還是使用一些 diff 工具來處理,畢竟手工處理容易出錯。

3、Cherry-Pick 的高階用法

前面介紹的最簡單的 git cherry-pick 只是最簡單也是最常用的方法,正常來說,我們直接使用最簡單的命令就可以了,如果 commit 多了,無非就是多重複執行幾次而已,但是 cherry-pick 還有一些高階點的用法,這裡瞭解一下。

git cherry-pick -x <commit_id>

增加 -x 引數,表示保留原提交的作者資訊進行提交。

在 Git 1.7.2 版本開始,新增了支援批量 cherry-pick ,就是可以一次將一個連續的時間序列內的 commit ,設定一個開始和結束的 commit ,進行 cherry-pick 操作。

git cherry_pick <start-commit-id>…<end-commit-id>

可以看到,它的範圍就是 start-commit-id 到 end-commit-id 之間所有的 commit,但是它這是一個 (左開,右閉] 的區間,也就是說,它將不會包含 start-commit-id 的 commit。

而如果想要包含 start-commit-id 的話,就需要使用 ^ 標記一下,就會變成一個 [左閉,右閉] 的區間,具體命令如下。

git cherry-pick <start-commit-id>^...<end-commit-id>

舉個例子來說明一下:

Cherry-Pick | 一日一 Git

使用 git log —pretty=online 來檢視當前分支最近的提交,注意 git 命令中,對於 commit-id 的操作,都只需要使用前五位就可以了。

git cherry-pick 371c2…971209 // (2,5]

git cherry-pick 371c2^…971209 // [2,5]

3、注意事項

無論是對單個 commit 進行 cherry-pick ,還是批量處理,注意一定要根據時間線,依照 commit 的先後順序來處理,否者會有意想不到的問題。

如果遇上衝突,最好不要手工解決衝突,還是需要依賴工具來完成的,最簡單的就是 Android Studio 中為我們提供的一套簡單的 git 管理根據,接下來,就讓我們看看在 Android Studio 中,如何使用 cherry-pick 吧。

三、AS 中的 Cherry-Pick

Android Studio 中,其實已經為開發者提供了非常成熟的 Version Control 工具,一般使用快捷鍵 alt+9 開啟。

在 Version Control 視窗中,可以檢視到所有的 commit log。

Cherry-Pick | 一日一 Git

在這個視窗中,可以看到一個非常直觀的 git log 的情況,當然這是一個 git 管理工具的必備的,沒什麼好說道的。

如果想對某一次 commit 進行 cherry-pick 操作的話,找到這個 commit ,點選右鍵。

Cherry-Pick | 一日一 Git

選擇 Cherry-Pick 即可,一個櫻桃的 icon 。

順利的話,沒有衝突,就會出現一個 commit changes 的對話方塊,可以直接提交當前的操作,並且 commit message 已經幫我們寫好了,記錄清楚是從那個 commit 進行的 cherry-pick 操作。

Cherry-Pick | 一日一 Git

如果不那麼順利,遇見了衝突,就需要我們來處理衝突了,AS 其實也提供了非常直觀的處理衝突的 diff 工具,會先提示需要處理衝突。

Cherry-Pick | 一日一 Git

這裡可以點選 Accept Yous 或者 Accept Theirs 來標記是使用你的程式碼,還是第三方合併過來的程式碼。當然既然有衝突,通常我們需要 點選 merge 按鈕,自己來解決衝突。

Cherry-Pick | 一日一 Git

最終,將程式碼按我們的預期 merge 之後,點選 Apply 即可完成合並,同時生成個 commit 進行提交。

Cherry-Pick | 一日一 Git
公眾號二維碼.jpg

相關文章