描述:你可以这样理解,git cherry-pick
是一个特别的 git merge
。有时候不需要将一个分支全部的代码变动都进行合并,而是将部分的代码变动进行合并,即只合并一个或多个现有的提交。
举例:现在有两个分支 master 和 test,希望能将 test 分支里的 commit_b
的提交合并到 master 分支里去,如下图所示:
执行 git cherry-pick
后,如下图所示:
commitId
进行合并;$ git cherry-pick <commitId>
— — — — — — — — — — — — — — — — — — 举例如下 — — — — — — — — — — — — — — — — — —
# master 分支里的提交:
$ git log --pretty=oneline
--->>
3ee2c7b26845a54a97f466644616a7907432ca73 (HEAD -> master) modify-test
69322b677a3a6be363ba559610988607480677ce init
---<<
# test 分支里的提交:
$ git log --pretty=oneline
--->>
389a14dcc9434026e176858733b95598dd192efa (HEAD -> test) console-log
7a54c5fede3905d025bf4e6df1698ec0569fd839 ✨new-function
3ee2c7b26845a54a97f466644616a7907432ca73 (master) modify-test
69322b677a3a6be363ba559610988607480677ce init
---<<
# 现在将 test 分支里的 'new-function' 的提交合并到 master 分支中:
# 01 首先切到 master 分支
$ git checkout master
--->>
Switched to branch 'master'
---<<
# 02 执行 cherry-pick ,并将复制过来
$ git cherry-pick 7a54c5fede3905d025bf4e6df1698ec0569fd839
--->>
[master 0d28d12] ✨new-function
Date: Tue Dec 7 16:50:59 2021 +0800
1 file changed, 25 insertions(+)
create mode 100644 TheBestChoice.js
---<<
# 03 查看一下提交记录,合并成功啦!
$ git log --pretty=oneline
--->>
0d28d12418b5a97345ddfb75c753168f0d9a9f88 (HEAD -> master) ✨new-function
3ee2c7b26845a54a97f466644616a7907432ca73 modify-test
69322b677a3a6be363ba559610988607480677ce init
---<<
分支名
进行合并,即 合并该分支里的最新一次的提交;$ git cherry-pick <branch_name>
— — — — — — — — — — — — — — — — — — 举例如下 — — — — — — — — — — — — — — — — — —
# test 分支里的提交:
$ git log --pretty=oneline
--->>
f2170fd47807d2ef086d357c269a84c09409c55b (HEAD -> test) hello world
6ca9fb9b230158c60493826bf0fdf646f4f2213c add
b6cdb2628137e89401472b062343427d931f02eb modify hello
---<<
# 切到 master 分支后执行如下
$ git cherry-pick test
--->>
[master 6651c1e] new file
Date: Tue Dec 7 17:40:25 2021 +0800
1 file changed, 1 insertion(+)
create mode 100644 world.js
---<<
# 注意:如果合并有冲突,则需要手动解决冲突后进行 git add + git commit
# 注意:commitId 之间用空格隔开
$ git cherry-pick <commitId_A> <commitId_B> <commitId_C>
# 效果:合并从 A 到 B 的提交!
# 注意(1):这种方式并不包含 commitId_A;
# 注意(2):必须按照正确的顺序放置,即 A 必须早于 B,否则命令将失败,但不会报错。
$ git cherry-pick <commitId_A>..<commitId_B>
# 注意:使用^ ,则包含 commitId_A
$ git cherry-pick <commitId_A>^..<commitId_B>
配置项 | 描述 |
---|---|
-e ,--edit |
打开外部编辑器,编辑提交信息。 |
-n ,--no-commit |
只更新工作区和暂存区,不产生新的提交。 |
-x |
在提交信息的末尾追加一行 cherry picked from commit ... ,方便以后查到这个提交是如何产生的。 |
-s ,--signoff |
在提交信息的末尾追加一行操作者的签名,表示是谁进行了这个操作。 |
-e ,--edit |
打开外部编辑器,编辑提交信息。 |
详细说明:-m parent-number
,--mainline parent-number
cherry-pick
不知道采用哪个分支的代码变动,所以操作会失败。-m
配置项会标明采用某个分支的变动。它的参数 parent-number
是一个从 1 开始的整数,代表原始提交的父分支编号。$ git cherry-pick -m 1
,即表示 cherry-pick
采用提交 commitId
来自编号 1 父分支的变动。操作过程中或多或少会遇到一些不太顺利的情况,这个时候应该如何是好呢?
…
不用担心!若cherry-pick
过程中发生代码冲突,它会停止执行,让用户决定如何继续操作。
…
这里有三个配置项可以帮助你!
--continue
:解决代码冲突后,需要将修改的文件加入暂存区 git add .
,再执行 git cherry-pick --continue
,让 cherry-pick
过程继续进行。
--abort
:发生代码冲突后,放弃合并,回到操作前的样子。
--quit
:发生代码冲突后,退出 cherry-pick
,但是不回到操作前的样子。