分类: LINUX
2009-05-11 21:35:34
上次的内容比较少,主要是想调节一下大家的心情,总是在大量的文字之间徘徊,身心俱惫。(呵呵,想偷懒有太多种理由,其实主要原因是昨天参与了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
2 #include
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
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
#include
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
2 #include
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的关怀无微不至吧。