每天对自己多问几个为什么,总是有着想象不到的收获。 一个菜鸟小白的成长之路(copyer)
在最近的项目中,一个同事使用 git cherry-pick
,这个指令,我确实看懵了,我根本就没有看到过,所以,就下来了解了一波。学习总是好的嘛。
使用场景
master
分支用来发布版本的
dev
用来开发的功能模块的
在实际的开发过程中,可能遇到这样的情况,所以程序员都早疯狂的写代码,已经在dev
分支上完成了 A功能
、B功能
、C 功能
。有一天,老板为了赚钱,要求程序员先把 A功能
和 B 功能
先上线,C功能
和正在开发的其他功能下次再上线。 那么对于程序员来说,肯定不能使用 git merge
,因为这样会把当前正在开发的功能也上传上去,影响程序的运行。所以,这下就需要使用 cherry-pick
这个指令。
基本使用
git cherry-pick commitId
实例
// 初始化
git init
// master的代码提交
touch master.js
git add . && git commit -m 'master c1'
// 创建dev分支
git checkout -b 'dev'
touch a.js
git add . && git commit -m 'a'
touch b.js
git add . && git commit -m 'b'
touch c.js
git add . && git commit -m 'c'
git log(dev)
这里已经开发完成了3个功能,现在只需要把 A
B
功能上线。
所以我需要在master分支
上使用 cherry-pick
命令。
首先: 我们需要先记录下 a
和b
的commitId
, 只需要前面的几位就可以了。
a 57c1b614a
b aa1f03dd0999
接下来,切换到master分支上
git checkout master
git cherry-pick 57c1b614a
git cherry-pick aa1f03dd0999
然后看下
git log
这样 A
B
功能就被合并过去了,但是这里需要注意的是:这里的commitID
的改变了的。
但是呢?还是有个问题,如果需要移植很多,难道还要一次一次的执行命令吗?答案肯定不是的,
这里也支持区间
git cherry-pick commit1..commit100
但是要注意,这是一个左开右闭
的操作,也就是说,commit1
不会被合并到master分支,而commit100
则会。
使用:
切换 到 master分支
git checkout master
git cherry-pick 0785f5c670e70609..daba06ba67367
// master c1 不会被合并
// b 会被合并
这样的效果是一样的
选项
cherry-pick
命令每拣选一个commit就会提交一次生成一个新的commit id。
如果我们想让每个commit 拣选后暂缓提交,等到所有commit都拣选完成后,自己手动commit,应该怎么办呢?答案是用-n
选项。
git cherry-pick -n 0785f5c670e70609..daba06ba67367
这样,所以都都被保存到缓存区了,然后自己手动 commit
, 写一个总commit记录
的就行了。
总结
cherry-pick是新的知识,了解的太少,需要学习
// 命令总结
git cherry-pick commitId
git cherry-pick commitId..commitId (左开右闭)
git cherry-pick -n