使用场景:
对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。
这时分两种情况。一种情况是,你需要另一个分支的所有代码变动,那么就采用合并(git merge
)。另一种情况是,你只需要部分代码变动(某几个提交),这时可以采用 Cherry pick。
-
git cherry-pick
命令的作用,就是将指定的提交(commit)应用于其他分支。
转移单个提交
举例:有两个特性分支 需要把 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
,应用于当前分支。这会在当前分支产生一个新的提交,当然它们的哈希值会不一样。
命令三四:因为拉取到commit只是把代码更新到本地,并没有上传到远程。所以要push 上传到远程 这里不需要commit 因为没有代码的改变 commit会失败
这时候 FeatureOne远程的代码就会被更新 如下:
a - b - c - d - f FeatureOne
\
e - f - g FeatureTwo
转移多个提交
操作过程和单个提交一样
在 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的连续提交方法
代码冲突
如果操作过程中发生代码冲突,Cherry pick 会停下来,让用户决定如何继续操作。
--continue
用户解决代码冲突后,第一步将修改的文件重新加入暂存区(git add .
),第二步使用下面的命令,让 Cherry pick 过程继续执行。
$ git cherry-pick --continue
--abort
发生代码冲突后,放弃合并,回到操作前的样子。
$ git cherry-pick --abort
--quit
发生代码冲突后,退出 Cherry pick,但是不回到操作前的样子。
$ git cherry-pick --quit