之前使用git,在另一个分支上比较长时间地进行开发,开发过程中需要master分支上更新的一个小模块的代码,而为了避免未知的问题,并不想先将master分支合并进来.当时使用了直接复制代码的方法进行解决.
之后在对git的进一步学习中,了解到了可以通过cherry-pick指令,来让git代替你完成这些工作.
下面给出了一个例子,拙劣地表现了工作中遇到的场景,首先是代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#include<stdio.h> void func1() { /* 第一个功能的代码,master分支的提交1 */ printf("NyanNyan!"); } /* 需要变换事先约定的接口(参数)啦,master分支的提交2 */ void func2(int i) { /* 第二个功能的代码,Devel分支的提交1 */ printf("WangWang!"); /* Ummm...需要猫叫,提取一下功能代码吧...准备cherryPick,Devel分支的提交2 */ func1();//喵!,Devel分支的提交4 } int main() { /*最初的提交*/ } |
在完成最初的提交后,func1和func2分别交给两个人完成,而之后func2的开发过程中,需要使用已完成基础功能的func1,于是将完成基础功能的提交,cherrypick到自己当前的devel分支上(git cherry-pick 705216)(这个场景其实直接merge也行,应该倒转一下master的提交1,2顺序的).最后将所有的工作合并到master分支.分支结构如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 |
$ git log --graph --pretty=oneline * 2a140549f4fee2441d3af5136047d2479bc2323c Merge branch 'Devel' |\ | * 445f68062169124ff39894a4afc4384f5a712fff 喵!Submit4 | * 4f3f4163eab73a6c5bb363785f0857271595437d Nyan Function1(CherryPick) | * 0bdb7c5851f71d2952a99d8f041e9c3d90fda0d5 Submit2 | * f90b8d06d539a775880fd29025d267d1a6a5e416 Submit 1 * | f231189f6b9ec6e4df90657ecd30086afe85f520 Submit2 * | 7052164fb7c2af4f012789ae224bee55d2419f23 Nyan Function1 |/ * 6ce7ee0d8d54a59d2180ad396f7df6088c5dfd45 Two Functions * 4bd4be5e7a0d803b6cdbed1374b8996a5d927bc9 Initial commit |
因为提交的内容是相同的,所以cherry-pick所修改的地方在合并时并不会冲突.
PS1:cherry-pick -x 就会自动在生成的提交内容里加上”这是cherry-pick自xxxx提交”之类的信息
PS2:虽然内容相同,可是不同的提交哦
PS3:f7(eiki)….~