介绍说明
在开发的时候,我们通常会在同一个开发分支(B)上,同时开发多个功能,但最终可能只需要上线(合并到master分支)部分功能。显然这时直接将B分支合并(pull request)到master分支,是会将所有提交都合并到master,所以这里我们无法直接使用pull requst。直接将B分支推送到master分支是同一个结果。
这时我们可以使用到cherry-pick命令拉取代码,cherry-pick可以做到commit维度的代码拉取,也就是只拉取某次commit中的所有代码变更。我们想要上线部分功能可以从这个命令入手。
git cherry-pick <commit id>
cherry-pick:选出自己喜欢的
案例
当俩分支(B、D)在同一个版本时,此时再在B分支开发功能,第一天B与M分支为同样的版本(即一样的代码),在第2、3、4天都有在B分支上开发新的功能或者做了修改,每次改动都会及时提交(commit)。到了第五天,经理说马上要上线用户查询和用户新增的功能到D分支,进行功能测试。
| 时间/天 | B分支版本 | D分支版本 |
|---|---|---|
| 1 | 版本1 | 版本1 |
| 2 | 版本2 (用户查询:commit1) | 版本1 |
| 3 | 版本3 (用户查询:commit1)(登录功能:commit2) | 版本1 |
| 4 | 版本4 (用户查询:commit1)(登录功能:commit2)(用户新增:commit3) | 版本1 |
| 5 | 版本4 (用户查询:commit1)(登录功能:commit2)(用户新增:commit3) | 版本4 (用户查询:commit1)(用户新增:commit3) |
想要达到第五天的效果,我们可以使用cherry-pick,来选出自己想要的commit,来合并到D分支上。
#需要先切换到D分支后,再执行cherry-pick命令,可以将别的分支的commit选取拉到当前分支。
git cherry-pick commit1编号
git cherry-pick commit3编号
某一次commit的编号可以在git上查看

commit的编号可以在git上查看
可以从idea上查看

commit的编号可以在idea上看
当然也可以在commit之后使用git log命令查看
sou@xiangyudeMacBook-Pro chat-joy % git log
commit 1f2c871b162353879a38f93505d9fa1a6b126aa2 (HEAD -> master)
Author: xiangyu <1097679666@qq.com>
Date: Tue Sep 27 11:08:06 2022 +0800
user test2 method plus
commit 4f64089e5e936b5b6e929d0dd9f71a2fb2177373
Author: xiangyu <1097679666@qq.com>
Date: Tue Sep 27 10:56:01 2022 +0800
user test2 method
commit a23b90804d9a672d5d7eaf710e182fa4ad330974 (origin/master, origin/HEAD)
sou@xiangyudeMacBook-Pro chat-joy % git log
commit 1f2c871b162353879a38f93505d9fa1a6b126aa2 (HEAD -> master)
Author: xiangyu <1097679666@qq.com>
Date: Tue Sep 27 11:08:06 2022 +0800
user test2 method plus
commit 4f64089e5e936b5b6e929d0dd9f71a2fb2177373
Author: xiangyu <1097679666@qq.com>
Date: Tue Sep 27 10:56:01 2022 +0800
user test2 method
commit a23b90804d9a672d5d7eaf710e182fa4ad330974 (origin/master, origin/HEAD)
注意点
在拉取多个提交时应按照先后提交顺序拉取,并将某个功能的所有commit都拉取到以免代码丢失。
假如,只拉取commit3,但是commit3与commit1是在同一个文件中做修改,这是会有冲突出现。但是只拉取commit1而忘记了commit3,这时不会有冲突,但是后续便丢失了commit3的代码。
避免代码的冲突与丢失
为了避免冲突的出现与代码的丢失,我们可以做下面几点来预防:
- 创建一个自己独立的分支。避免多人使用同一个分支。
- 每次提交都只包含一个功能(能一起上线的功能)。这样可以在cherry-pick时更加方便。
- cherry-pick时可以用idea将某个功能的所有提交,全选出来,一次性都pick出来。或者,按照先后顺序将commit依次pick过来,直接pick多次修改后的commit会存在冲突。
先选中多个commit

idea中选中多个commit
再右键,Cherry-Pick

执行Cherry-Pick