本文博客地址:Git cherry-pick 操作.
在开发过程中,切换分支和合并代码是常用的操作,想想一种场景,在一个分支上进行了新版本开发,开发了若干新特性 featureD、featureE 等等,但是需要变更,这个开发被搁置了,但是又想引入新的 featureD 特性,这个时候 cherry-pick 就是一个很有用的操作了。
介绍
git cherry-pick 命令用来将指定的 commit 应用到其它的分支。
下面以上面的例子介绍 cherry-pick 的使用,假设当前的分支状态如下图所示:
a - b #Main
\
D - E #Feature
想要在主分支应用 featureD 特性,可以进行如下的操作:
$ git checkout main
$ git cherry-pick D
现在的分支状态变成了下面的结构:
a - b - D #Main
\
C - D - E #Feature
使用
语法:
git cherry-pick ..
可以 cherry-pick 一个或多个提交。
git cherry-pick commitHashA..commitHashB
可以 cherry-pick 从 commitHashA 到 commitHashB 之间的所有提交,其中不包含 commitHashA ,包含 commitHashB。
如:
# before
a - b #Main
\
C - D - E - F #Feature
# 执行
$ git cherry-pick D..F
# after
a - b - E - F #Main
\
C - D - E - F #Feature
git cherry-pick commitHashA^..commitHashB
同上面类似,区别在于包含 commitHashA 的提交:
# before
a - b #Main
\
C - D - E - F #Feature
# 执行
$ git cherry-pick D..F
# after
a - b - D - E - F #Main
\
C - D - E - F #Feature
git cherry-pick
可以将 <branchName> 上的最新提交 cherry-pick 到当前分支
几个有用的参数
-e 或 --edit
允许你在提交之前编辑提交消息。
-x
在原来的提交信息里追加一行 cherry picked from commit … 信息。
-m 或 --mainline
如果提交的是一个合并分支的提交,这个操作会失败,因为 cherry-pick 不知道选择那边的改动。
这个参数的作用就是告诉 cherry-pick 采用哪边的改动,通常不建议 cherry-pick 合并分支的提交。
-n 或 --no-commit
只应用指定提交的内容变更,但不会产生新的提交,即需要自己手动进行 git commit 的过程。
冲突处理
git cherry-pick (--continue | --skip | --abort | --quit)
在 cherry-pick 过程中,有时候会有代码的冲突,这时 cherry-pick 的操作会暂停,可以选择如下操作:
git cherry-pick --continue
在解决冲突后,可以使用 git cherry-pick --continue 继续后面的 cherry-pick 过程。
git cherry-pick --skip
跳过当前的 commit,继续后续的 cherry-pick 过程。
git cherry-pick --abort
放弃 cherry-pick,回到 cherry-pick 之前的状态。
git cherry-pick --quit
停止 cherry-pick,不回到 cherry-pick 之前的状态,保留现状。
参考
本文博客地址:Git cherry-pick 操作.
在开发过程中,切换分支和合并代码是常用的操作,想想一种场景,在一个分支上进行了新版本开发,开发了若干新特性
featureD、featureE等等,但是需要变更,这个开发被搁置了,但是又想引入新的featureD特性,这个时候cherry-pick就是一个很有用的操作了。介绍
git cherry-pick命令用来将指定的commit应用到其它的分支。下面以上面的例子介绍
cherry-pick的使用,假设当前的分支状态如下图所示:想要在主分支应用
featureD特性,可以进行如下的操作:现在的分支状态变成了下面的结构:
使用
语法:
git cherry-pick ..
可以
cherry-pick一个或多个提交。git cherry-pick commitHashA..commitHashB
可以 cherry-pick 从
commitHashA到commitHashB之间的所有提交,其中不包含commitHashA,包含commitHashB。如:
git cherry-pick commitHashA^..commitHashB
同上面类似,区别在于包含
commitHashA的提交:git cherry-pick
可以将
<branchName>上的最新提交 cherry-pick 到当前分支几个有用的参数
-e 或 --edit
允许你在提交之前编辑提交消息。
-x
在原来的提交信息里追加一行
cherry picked from commit …信息。-m 或 --mainline
如果提交的是一个合并分支的提交,这个操作会失败,因为
cherry-pick不知道选择那边的改动。这个参数的作用就是告诉
cherry-pick采用哪边的改动,通常不建议cherry-pick合并分支的提交。-n 或 --no-commit
只应用指定提交的内容变更,但不会产生新的提交,即需要自己手动进行
git commit的过程。冲突处理
在
cherry-pick过程中,有时候会有代码的冲突,这时 cherry-pick 的操作会暂停,可以选择如下操作:git cherry-pick --continue
在解决冲突后,可以使用
git cherry-pick --continue继续后面的 cherry-pick 过程。git cherry-pick --skip
跳过当前的
commit,继续后续的 cherry-pick 过程。git cherry-pick --abort
放弃 cherry-pick,回到 cherry-pick 之前的状态。
git cherry-pick --quit
停止 cherry-pick,不回到 cherry-pick 之前的状态,保留现状。
参考