看日记学git

《看日记学git》之六

《看日记学git》系列

《看日记学git》之序 《看日记学git》之一

《看日记学git》之二 《看日记学git》之三

《看日记学git》之四 《看日记学git》之五

===

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

gitk的开发分支的gui
gitk的开发分支的gui

===
如果你对git感兴趣,请继续阅读:

《看日记学git》之七

《看日记学git》之八

《看日记学git》之九(总结)

over~

1条评论

发表您的评论

请您放心,您的信息会被严格保密。必填项已标识 *