对于多分支的代码库,将提交记录从一个分支转移到另一个分支是常见需求。这时分两种情况:
git cherry pick是一个很强大的命令,支持从某次、多次提交、多次连续提交、分支及其他远程仓库中进行代码的应用操作。
$ git cherry-pick $ git cherry-pick $ git cherry-pick $ git cherry-pick A..B$ git cherry-pick A^..B$ git remote add target git://gitUrl$ git fetch target$ git log target/master$ git cherry-pick -e,--edit-n,--no-commit-x-s,--signoff-m parent-number,--mainline parent-numberparent-number是一个从1开始的整数,代表原始提交的父分支编号。$ git cherry-pick -m 1
上面命令表示,Cherry pick 采用提交commitHash来自编号1的父分支的变动。
一般来说,1号父分支是接受变动的分支(the branch being merged into),2号父分支是作为变动来源的分支(the branch being merged from)。
如果操作过程中发生代码冲突,cherry-pick会被中断,让用户决定如何继续操作。
--continuegit add .),让cherry pick过程继续执行:$ git cherry-pick --continue--abort--quit1.The previous cherry-pick is now empty, possibly due to conflict resolution.
原因:在cherry-pick时出现冲突,解决冲突后本地分支中内容和cherry-pick之前相比没有改变,因此当在以后的步骤中继续git cherry-pick或执行其他命令时,由于此时还处于上次cherry-pick,都会提示该信息,表示可能是由于解决冲突造成上一次cherry-pick内容是空的。
解决方案:
git cherry-pick --abort取消上次操作git commit --allow-empty,表示允许空提交。2.fatal: You are in the middle of a cherry-pick – cannot amend.
原因:在cherry-pick时出现冲突,没有解决冲突就执行git commit --amend命令,从而会提示该信息。
解决方案:在git commit --amend之前解决冲突,并完成这次cherry-pick:
$ git add .
$ git cherry-pick --continue
https://www.git-scm.com/docs/git-cherry-pick
https://zhuanlan.zhihu.com/p/90816644