介绍
git cherry-pick 可以选择某一个分支中的一个或几个commit(s)来进行操作。例如,假设我们有个稳定版本的分支,叫prd,另外还有个开发版本的分支dev,我们不能直接把两个分支合并,这样会导致稳定版本混乱,但是又想增加一个dev中的功能到prd中,这里就可以使用cherry-pick了,其实也就是对已经存在的commit 进行再次提交。
这个流程也适用于hotfix流程, 比如在prd分支上提交个bugfix,需要提交到dev分支。
用法
git cherry-pick <commit id>
注意:当执行完 cherry-pick 以后,将会生成一个新的提交;这个新的提交的哈希值和原来的不同,但标识名一样;
示例
把prd上的某个commit合并到dev。
- 找到某次提交到prd分支的的commit id - 29259ee, 执行如下命令
$ git checkout dev
$ git cherry-pick 29259ee ## 这个 29259ee,位于prd分支中
- 接下来正常commit, 如果有冲突就手工解决。
若提示:
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
git cherry-pick --quit
git cherry-pick --abort
命令集合
git cherry-pick <commit id>:单独合并一个提交
git cherry-pick -x <commit id>:同上,不同点:保留原提交者信息。
Git从1.7.2版本开始支持批量cherry-pick,就是一次可以cherry-pick一个区间的commit。
git cherry-pick <start-commit-id>..<end-commit-id>
git cherry-pick <start-commit-id>^..<end-commit-id>
前者表示把<start-commit-id>到<end-commit-id>之间(左开右闭,不包含start-commit-id)的提交cherry-pick到当前分支;
后者有"^"标志的表示把<start-commit-id>到<end-commit-id>之间(闭区间,包含start-commit-id)的提交cherry-pick到当前分支。
其中,<start-commit-id>到<end-commit-id>只需要commit-id的前6位即可,并且<start-commit-id>在时间上必须早于<end-commit-id>
注:以上合并,需要手动push代码。