学习git(八):git cherry-pick的使用

每天对自己多问几个为什么,总是有着想象不到的收获。 一个菜鸟小白的成长之路(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命令。

首先: 我们需要先记录下 abcommitId , 只需要前面的几位就可以了。

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 

猜你喜欢

转载自blog.csdn.net/James_xyf/article/details/120817391