盒子
盒子
文章目录
  1. 前言
  2. 什么是 cherry-pick
  3. 如何使用 cherry-pick
  4. 参考

使用git-cherry-pick

前言

在一个项目中可能有多个功能并行开发着,开发完的代码通常就合到develop分支进行测试,即测试环境中会有多个功能在测试,而先后进入测试并不一定先后上线,很有可能因为某些原因,先开发的功能需要延期上线,后开发的功能测试完后得先上线。这时候需要将后开发的功能代码抽出来,git cherry-pick就派上用场

什么是 cherry-pick

cherry-pick是git中的一个命令,像pull,push,commit一样。
它可以用于将在其他分支上的 commit 修改,移植到当前的分支。
如之前所说场景,就可以使用 cherry-pick 命令,将这个功能相关的 commit 提取出来,合入稳定版本的分支上。

如何使用 cherry-pick

git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] [--ff]
      [-S[<keyid>]] <commit>…​
git cherry-pick --continue
git cherry-pick --quit
git cherry-pick --abort

常用的使用方式是

git cherry-pick commit-id

执行 git log --graph --oneline --all可以看到类似下面的log

* f07407f (origin/develop, develop) feat: 这是第三个功能
* 948fa63 feat: 这是第二个功能
* ba09a70 feat: 这是第一个功能
* e6d4aef (HEAD -> master, origin/master, origin/HEAD) Initial commit

如果我们需要将第二个功能摘取出来,即commit-id948fa63

git cherry-pick 948fa630

执行完之后会产生一个新的commitid,如果遇到有冲突,git diff或者用diff工具修改就行,顺利的话就可以正常提交了。
此时执行 git log --graph --oneline --all

* 762491f (HEAD -> develop, origin/develop) feat: 这是第二个功能
* f07407f feat: 这是第三个功能
* 948fa63 feat: 这是第二个功能
* ba09a70 feat: 这是第一个功能
* e6d4aef (origin/master, origin/HEAD, master) Initial commit

而当前的代码也是第二个功能时的代码。
这时候第三个功能也要上线了,那就将它也摘出来吧

git cherry-pick -x f07407f

上面命令多了 -x 参数,这是更高级一点的用法,表示保留原提交的作者信息进行提交。
当然,如果需要摘出多个commit-id,首先可以重复执行git cherry-pick,另外可以使用下面的方式

git cherry-pick <start-commit-id><end-commit-id>

它的范围就是 start-commit-idend-commit-id 之间所有的 commit-id,但是它这是一个 (前开,后闭] 的区间,也就是说,它将不会包含 start-commit-idcommit-id
而如果想要包含 start-commit-id 的话,就需要使用 ^ 标记一下,就会变成一个 [前闭,后闭] 的区间

参考