Git 笔记 - git cherry-pick

01 基本用法

描述:你可以这样理解,git cherry-pick 是一个特别的 git merge。有时候不需要将一个分支全部的代码变动都进行合并,而是将部分的代码变动进行合并,即只合并一个或多个现有的提交。
举例:现在有两个分支 master 和 test,希望能将 test 分支里的 commit_b 的提交合并到 master 分支里去,如下图所示:

test
master
创建新分支 test
commit_c
commit_b
commit_a
commit_2
commit_4
commit_3
commit_1

执行 git cherry-pick <commit_b 的 commitId> 后,如下图所示:

test
master
创建新分支 test
commit_c
commit_b
commit_a
commit_2
commit_b
commit_4
commit_3
commit_1

02 应用场景

2.1 合并某个提交

  • 方式 1:通过 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 ,并将<commitId>复制过来
$ 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
---<<
  • 方式 2:通过 分支名 进行合并,即 合并该分支里的最新一次的提交;
$ 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

2.2 合并多个提交

  • 方式 1:一次合并多个提交;
# 注意:commitId 之间用空格隔开
$ git cherry-pick <commitId_A> <commitId_B> <commitId_C>
  • 方式 2:一次合并连续几个提交;
# 效果:合并从 A 到 B 的提交!
# 注意(1):这种方式并不包含 commitId_A;
# 注意(2):必须按照正确的顺序放置,即 A 必须早于 B,否则命令将失败,但不会报错。
$ git cherry-pick <commitId_A>..<commitId_B>

# 注意:使用^ ,则包含 commitId_A 
$ git cherry-pick <commitId_A>^..<commitId_B>

2.3 配置项的使用

配置项描述
-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 开始的整数,代表原始提交的父分支编号。
  • 注意:一般来说,1 号父分支是接受变动的分支,2 号父分支是作为变动来源的分支。
  • 示例:$ git cherry-pick -m 1 <commitId> ,即表示 cherry-pick 采用提交 commitId 来自编号 1 父分支的变动。

2.4 使用注意事项

操作过程中或多或少会遇到一些不太顺利的情况,这个时候应该如何是好呢🤔?

不用担心!若cherry-pick过程中发生代码冲突,它会停止执行,让用户决定如何继续操作。

这里有三个配置项可以帮助你!

  • --continue :解决代码冲突后,需要将修改的文件加入暂存区 git add .,再执行 git cherry-pick --continue,让 cherry-pick 过程继续进行。

  • --abort :发生代码冲突后,放弃合并,回到操作前的样子。

  • --quit :发生代码冲突后,退出 cherry-pick,但是不回到操作前的样子。

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值