===
上次的内容比较少,主要是想调节一下大家的心情,总是在大量的文字之间徘徊,身心俱惫。(呵呵,想偷懒有太多种理由,其实主要原因是昨天参与了SFD北邮站的活动的组织工作,晚上回家实在没有精力钻研git了)
===
这部分主要关注:如何管理分支。
首先要树立这样一种思想,软件开发不是一线到底的,而是有许多曲折的路要走的。我们如何保证走上曲折的道路后能够回归正确的道路呢?可以利用git的分支功能。(当然,事情都有两面性,有时候误认为曲折的道路最后发现是正确的道路。呵呵 各种情况,git也都全想到了)
还是接着我们之前的main.c的项目走。我想试着开发一个报时功能加入到main.c中,但我不保证这个功能一定能够实现。这个时候可以运行git branch命令来开启一个实验分支:
[root@wupengchong rocrocket]# git branch experimental [root@wupengchong rocrocket]#
好了,分支建立完毕!
我来查看一下:
[root@wupengchong rocrocket]# git branch experimental * master
看到喽,直接输入git branch,不加任何后续参数,就表示让git列出所有已存在的分支。前面带“星号”的分支表示当前所在的分支。
好,我要进行报时功能的开发,当然我就要切换到experimental分支:
[root@wupengchong rocrocket]# git checkout experimental Switched to branch “experimental”
好了,正如一小段英文所示,我们已经利用checkout命令成功切换到了experimental分支。好,现在就可以修改当前文件来开发我的报时功能了。(^_^,我现在是走在曲折的路上了)
修改之后的main.c如下:
[root@wupengchong rocrocket]# cat -n main.c 1 #include<stdio.h> 2 #include<time.h> 3 int main() 4 { 5 time_t mytime; 6 struct tm *mylocaltime; 7 mytime=time(NULL); 8 mylocaltime=localtime(&mytime); 9 printf(“Year:%d\n”,mylocaltime->tm_year+1900); 10 printf(“Month:%d\n”,mylocaltime->tm_mon+1); 11 printf(“Day:%d\n”,mylocaltime->tm_mday); 12 printf(“Hour:%d\n”,mylocaltime->tm_hour); 13 printf(“Min:%d\n”,mylocaltime->tm_min); 14 printf(“Second:%d\n”,mylocaltime->tm_sec); 15 printf(“Version: 0.02\n”); 16 printf(“Hello world!\n”); 17 return 0; 18 }
黑体为新加的内容。好了,我的报时功能已经完成了。看来这个分支是可行的:)
运行此程序,运行结果如下:
[root@wupengchong rocrocket]# ./a.out Year:2008 Month:9 Day:21 Hour:11 Min:17 Second:4 Version: 0.02 Hello world!
OK!运行也很完美。我可以完全的确认“这个走在分支上的项目”完全在正确的道路上。(话语有点拗口,希望你能明白)
下面的任务就是提交程序到分支项目:(注意虽然已经确认了分支的正确性,但还是不能着急报告给“主干道”,而还要先在分支上提交工作)
[root@wupengchong rocrocket]# git commit -a Created commit 0dff98a: This is a branch. 1 files changed, 11 insertions(+), 0 deletions(-)
然后就可以切换到“主干道”了:
[root@wupengchong rocrocket]# git checkout master Switched to branch “master”
(走在主干道上的你,无论使用log或是status命令都无法看到刚才在experimental分支所进行的工作。)
为了让git处理分支的本领展现的淋漓尽致,我们现在在主干道上再做一些改进。我们希望程序在最开始执行的时候输出一行“Welcome to roclinux.cn”。这行很简单,在主干道上完成后,main.c的内容如下:
[root@wupengchong rocrocket]# cat -n main.c 1 #include<stdio.h> 2 int main() 3 { 4 printf(“Welcome to roclinux.cn\n”); 5 printf(“Version: 0.02\n”); 6 printf(“Hello world!\n”); 7 return 0; 8 }
然后在主干道上使用git commit -a提交!
好!我们清理一下思路。在experimental分支上有一个增加了报时功能的main.c,而在主干道上有一个增加了welcome的main.c。它们都进行了git commit -a命令。
下面,我们就来合并“分支”和“主干道”(你猜会发生什么?):
[root@wupengchong rocrocket]# git merge experimental Auto-merged main.c CONFLICT (content): Merge conflict in main.c Automatic merge failed; fix conflicts and then commit the result.
报错了!因为我看到了conflict和failed这样的字眼。看来主干道上加入的welcome和分支干道产生了冲突。我们决定来修改主干道的welcome语句到文章的最后部位。主干道的main.c此时为:
[root@wupengchong rocrocket]# cat main.c #include<stdio.h> #include<time.h> int main() { <<<<<<< HEAD:main.c printf(“Welcome to roclinux.cn\n”);
=======
time_t mytime; struct tm *mylocaltime; mytime=time(NULL); mylocaltime=localtime(&mytime); printf(“Year:%d\n”,mylocaltime->tm_year+1900); printf(“Month:%d\n”,mylocaltime->tm_mon+1); printf(“Day:%d\n”,mylocaltime->tm_mday); printf(“Hour:%d\n”,mylocaltime->tm_hour); printf(“Min:%d\n”,mylocaltime->tm_min); printf(“Second:%d\n”,mylocaltime->tm_sec); >>>>>>> experimental:main.c printf(“Version: 0.02\n”); printf(“Hello world!\n”); return 0; }
请务必注意代码中三行红粗体字,显而易见这是git在告诉我们发生冲突的地点,中间的加红的“=======”表示两端冲突代码的分隔。可以看出git迷惑之处在于它不知道是把welcome这行放在前面还是把报时功能这段放在前面。呵呵 git正在迷惑中…
现在轮到我们人类来帮助告诉git我们想要什么了,修改这段冲突代码直到你自己满意为止吧。
修改后的main.c如下:
[root@wupengchong rocrocket]# cat -n main.c 1 #include<stdio.h> 2 #include<time.h> 3 int main() 4 { 5 printf(“Welcome to roclinux.cn\n”); 6 time_t mytime; 7 struct tm *mylocaltime; 8 mytime=time(NULL); 9 mylocaltime=localtime(&mytime); 10 printf(“Year:%d\n”,mylocaltime->tm_year+1900); 11 printf(“Month:%d\n”,mylocaltime->tm_mon+1); 12 printf(“Day:%d\n”,mylocaltime->tm_mday); 13 printf(“Hour:%d\n”,mylocaltime->tm_hour); 14 printf(“Min:%d\n”,mylocaltime->tm_min); 15 printf(“Second:%d\n”,mylocaltime->tm_sec); 16 printf(“Version: 0.02\n”); 17 printf(“Hello world!\n”); 18 return 0; 19 }
好,解决冲突后再次提交!
[root@wupengchong rocrocket]# git commit -a Created commit 0120247: This is the new version!
好了,我们成功的完成了“将分支合并到主干道”的工作。下面轻松一下:
[root@wupengchong rocrocket]# gitk
看看会出来什么!呵呵 git的关怀无微不至吧。
转载请注明:Git中国 » 【看日记学Git】之六