Git cherry-pick
git
2017-03-06

git cherry-pick 可以选择某一个分支中的一个或几个commit(s)来进行操作。例如,假设 我们有个稳定版本的分支,叫 v1.0 ,另外还有个开发版本的分支 v2.0 ,我们不能直接把 两个分支合并,这样会导致稳定版本混乱,但是又想增加一个 v2.0 中的功能到 v1.0 中, 这里就可以使用 cherry-pick 了。

简单用法:

git cherry-pick <commit id>

注意:当执行完 `cherry-pick` 以后,将会生成一个新的提交;这个新的提交的哈希值和 原来的不同,但标识名一样;

例如:

$ git checkout v1.0分支
$ git cherry-pick 1234435 # 这个 1234435 号码,位于v2.0分支中:

如果顺利,就会正常提交。结果:

Finished one cherry-pick.
On branch v1.0分支
Your branch is ahead of 'origin/old' by 2 commits.

如果在cherry-pick 的过程中出现了冲突

Automatic cherry-pick failed.
After resolving the conflicts,mark the corrected paths with 'git add <paths>' or 'git rm <paths>'and commit the result with:
git commit -c 8253414249218927947543957398674345
或者:
error: could not apply 145345656... dev
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'

就跟普通的冲突一样,手工解决:

2.1 $ git status # 看哪些文件出现冲突

both modified: app/models/MainActivity.java

2.2 $ vim app/models/MainActivity.java # 手动解决它。

2.3 $ git add app/models/MainActivity.java

2.4 git commit -c <新的commit号码>

2.5 再次 `cherry-pick` 剩余 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代码。

其它文章