1,使用方法及其作用
git cherry-pick 可以选择某一个分支中的一个或几个 commit(s) 来进行操作(操作的对象是 commit).例如,假设我们有个稳定版本的分支,叫 v2.0,另外还有个开发版本的分支 v3.0,我们不能直接把两个分支合并,这样会导致稳定版本混乱,但是又想增加一个 v3.0 中的功能到 v2.0 中,这里就可以使用 cherry-pick 了.
就是对已经存在的 commit 进行 再次提交;
使用方法如下:
git cherry - pick id >
查询 commit id 的查询可以使用 git log 查询(查询版本的历史),最简单的语法如下:
git log
详细的 git log 语法如下:
git log [<options>] [<since>..<until>] [[--] <path>...]
主要参数选项如下:
-p:按补丁显示每个更新间的差异
--stat:显示每次更新的修改文件的统计信息
--shortstat:只显示 --stat 中最后的行数添加修改删除统计
--name-only:尽在已修改的提交信息后显示文件清单
--name-status:显示新增,修改和删除的文件清单
--abbrev-commit:仅显示 SHA-1 的前几个字符,而非所有的 40 个字符
--relative-date:使用较短的相对时间显示(例如:"two weeks ago")
--graph:显示 ASCII 图形表示的分支合并历史
--pretty:使用其他格式显示历史提交信息
结果大概如下:
commit 0771a0c107dbf4c96806d22bbc6ef4c58dfe7075 Author: zhengcanrui Date: Mon Aug 8 14 : 41 : 54 2016 + 0800[modify][what] commit的备注信息
其中 0771a0c107dbf4c96806d22bbc6ef4c58dfe7075 就是我们的 commit id
注意:当执行完 cherry-pick 以后,将会 生成一个新的提交;这个新的提交的哈希值和原来的不同,但标识名 一样;(commit id 会变)
2,实践
首先切换到你要添加 commit 的分支,如:你要将 A 分支上面的 commit 添加到 B 分支上面,我们可以要先切换到 B 分支上面.(注意:cherry-pick 是一个本地的操作,假如你 pull 代码之后有人在 A 分支上有了新的 commit,需要你先 pull 代码在进行 cherry-pick,原因及其错误提示请见最后).
git checkout B
将 0771a0c107dbf4c96806d22bbc6ef4c58dfe7075 这个 commit(提交)合并到 B 分支上面.正常情况下,可以给出全部的 commit id,也可以只给出前面的一段,只要你提交中没有这一段重复的就好,剩下的部分 git 会帮你填充.
git cherry - pick 0771a0c107dbf4c#将上面的commit id为0771a0c107dbf4c96806d22bbc6ef4c58dfe7075的提交添加到B分支上面
1. 成功的情况
顺利的话,出现下面的情况证明你已经成功了
Finished one cherry - pick.#On branch B#Your branch is ahead of 'origin/B'by 1 commits.
2. 有冲突的情况
下面是有文件冲突,和 15a2b6c61927e5aed6718de89ad9dafba939a90b 这个提交冲突
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 15a2b6c61927e5aed6718de89ad9dafba939a90b
解决的冲突的方法也和普通的一样,手工检查.
1)查看冲突的文件
使用 git status
both modified: app / models / user.rb
2)打开上面的那个文件,解决冲突. 执行 add 命令,执行 commit 命令,最后在提交即可了
3,遇到的一些错误
使用下面 cherry-pick 命令执行某个 commit (编号为:77c6905dcf7f946cff594a69a33d12e22bedfae4)
git cherry - pick 77c6905dcf7f946cff594a69a33d12e22bedfae4
出现了如下的错误:
fatal: bad object 77c6905dcf7f946cff594a69a33d12e22bedfae4
场景及出现错误的原因:
我的情况是在 B 分支的同步 A 分支的一个 commit,出现了如标题的错误.我是直接在 web 上看到 A 分支新提交的这个 commit,然后我直接在本地的 B 分支中进行 git cherry-pick xxx.就出现了这个问题.经过尝试问题是出在了我没有切到 B 分支 pull 一下.总结过来就是 git cherry-pick 是本地特性,本地要有这个 commit 才可以被 git cherry-pick.
致谢:感谢您的阅读!
来源: http://www.cnblogs.com/0201zcr/p/5752771.html