想要获取更多文章能够访问个人博客 - 代码无止境。git
先想一想一个状况,如今咱们有一个功能急须要发布到线上,可是这个功能相关的代码所在的测试分(test)支有不少不该该发布的代码,那么这个时候咱们就须要将与这个代码相关的提交选择性的合并到master上并发布。若是你还不知道git cherry-pick
命令的话,颇有可能你会从master分支上检出一个新分支,而后在把相关的代码copy到新分支上而后再合并回master。固然这么作确实能够达到最终的目的,可是手动copy很容易遗漏某些东西,那么咱们这篇文章就来说解一下git cherry-pick
命令。bash
1.准备一个空的git仓库,并建立一个readme文件而后提交。并发
mkdir git-test
cd git-test
git init
touch README.md
git add README.md
git commit -m "第一次提交"
复制代码
2.基于master建立一个新的分支dev测试
git checkout -b dev
复制代码
3.修改两次README.md文件,并commit两次。执行git log
后咱们会看到以下内容:ui
$ git log
commit cc04beabf0678f54bf64635bd56160c78b0aa1e6 (HEAD -> dev)
Author: 代码无止境 <gancy.programmer@gmail.com>
Date: Mon Jun 17 18:35:44 2019 +0800
第三次提交
commit 32259aa35d0702d2d05c648938798f9a5bd4b9e7
Author: 代码无止境 <gancy.programmer@gmail.com>
Date: Mon Jun 17 18:35:23 2019 +0800
第二次提交
commit e7f478807d478a0c3e0af8659e0733a9d5b32c8b (master)
Author: 代码无止境 <gancy.programmer@gmail.com>
Date: Mon Jun 17 18:34:09 2019 +0800
第一次提交
复制代码
通过上面的步骤一个git cherry-pick
的使用场景就已经被咱们模拟出来了。假如说咱们如今dev上的第二次提交
就是咱们如今急须要发布的功能,那么咱们就须要使用git cherry-pick
命令将此次提交合并到master分支上。 1.在dev分支上执行git log
命令,找到目标commit的commitid. 2.切换到master分支spa
git checkout master
复制代码
3.执行git cherry-pick命令code
git cherry-pick 32259aa35d0702d2d05c648938798f9a5bd4b9e7
复制代码
4.再次执行git log命令就能够看到目标提交已经被合并到master上了get
$ git log
commit 845d18e1193e4ad4361c8065173ed9b96fcc5227 (HEAD -> master)
Author: 代码无止境 <gancy.programmer@gmail.com>
Date: Mon Jun 17 18:35:23 2019 +0800
第二次提交
commit e7f478807d478a0c3e0af8659e0733a9d5b32c8b
Author: 代码无止境 <gancy.programmer@gmail.com>
Date: Mon Jun 17 18:34:09 2019 +0800
第一次提交
复制代码
上面只是git cherry-pick
命令的简单用法,其实这个命令还提供了很多的参数。博客
git cherry-pick [<options>] <commit-ish>...
经常使用options:
--quit 退出当前的chery-pick序列
--continue 继续当前的chery-pick序列
--abort 取消当前的chery-pick序列,恢复当前分支
-n, --no-commit 不自动提交
-e, --edit 编辑提交信息
复制代码
若是咱们执行git cherry-pick合并以后发生了冲突,这个时候Git会自动帮咱们新建一个分支,以下所示:string
MINGW64 ~/Desktop/p/write/笔记/git-test (master|CHERRY-PICKING)
复制代码
若是咱们想取消此次合并能够执行git cherry-pick --quit
或者git cherry-pick --abort
命令取消此次挑拣。 两者不一样的地方在于前者会将当前分支中未冲突的内容状态变为modified, 然后者则会直接将当前分支的内容回退到挑拣以前的状态。固然若是咱们也能够解决冲突以后执行以下命令继续合并:
git add *
git cherry-pick --continue
复制代码
后面的-n
和-e
,就比较容易理解了,-n
就是挑拣后不会自动提交,须要咱们执行git commit
命令进行提交,而-e
则是能够改变挑拣的message信息。