使用場景:
對于多分支的代碼庫,將代碼從一個分支轉(zhuǎn)移到另一個分支是常見需求。
這時分兩種情況。一種情況是,你需要另一個分支的所有代碼變動,那么就采用合并(git merge)。另一種情況是,你只需要部分代碼變動(某幾個提交),這時可以采用 Cherry pick。
-
git cherry-pick命令的作用,就是將指定的提交(commit)應用于其他分支。
轉(zhuǎn)移單個提交
舉例:有兩個特性分支 需要把 FeatureTwo 里面的 名為 f 的commit (提交改動的代碼) 追加到FeatureOne (FeatureOne也想要這個修改的代碼)
a - b - c - d FeatureOne
\
e - f - g FeatureTwo
做法:
$ git checkout FeatureOne
$ git cherry-pick <commitHash> //FeatureTwo提交的commit Hash值
$ git add .
$ git push origin FeatureOne
注意:
命令二:上面的命令會將指定的提交commitHash,應用于當前分支。這會在當前分支產(chǎn)生一個新的提交,當然它們的哈希值會不一樣。
命令三四:因為拉取到commit只是把代碼更新到本地,并沒有上傳到遠程。所以要push 上傳到遠程 這里不需要commit 因為沒有代碼的改變 commit會失敗
這時候 FeatureOne遠程的代碼就會被更新 如下:
a - b - c - d - f FeatureOne
\
e - f - g FeatureTwo
轉(zhuǎn)移多個提交
操作過程和單個提交一樣
在 cherry-pick 后面 用法不同
$ git cherry-pick <HashA> <HashB> //列舉commitHash值
//$ git cherry-pick ABDC KIJHNBGH 不用加<><>
$ git cherry-pick A..B //A到B所有的提交
注意:它們必須按照正確的順序放置:提交 A 必須早于提交 B,否則命令將失敗,但不會報錯。
**** 這個命令不會包含提交A
$ git cherry-pick A^..B
**** 包含提交A的連續(xù)提交方法
代碼沖突
如果操作過程中發(fā)生代碼沖突,Cherry pick 會停下來,讓用戶決定如何繼續(xù)操作。
--continue
用戶解決代碼沖突后,第一步將修改的文件重新加入暫存區(qū)(git add .),第二步使用下面的命令,讓 Cherry pick 過程繼續(xù)執(zhí)行。
$ git cherry-pick --continue
--abort
發(fā)生代碼沖突后,放棄合并,回到操作前的樣子。
$ git cherry-pick --abort
--quit
發(fā)生代碼沖突后,退出 Cherry pick,但是不回到操作前的樣子。
$ git cherry-pick --quit