[计算机软件及应用]看日记学git.doc

上传人:sccc 文档编号:4561923 上传时间:2023-04-27 格式:DOC 页数:122 大小:535KB
返回 下载 相关 举报
[计算机软件及应用]看日记学git.doc_第1页
第1页 / 共122页
[计算机软件及应用]看日记学git.doc_第2页
第2页 / 共122页
[计算机软件及应用]看日记学git.doc_第3页
第3页 / 共122页
[计算机软件及应用]看日记学git.doc_第4页
第4页 / 共122页
[计算机软件及应用]看日记学git.doc_第5页
第5页 / 共122页
点击查看更多>>
资源描述

《[计算机软件及应用]看日记学git.doc》由会员分享,可在线阅读,更多相关《[计算机软件及应用]看日记学git.doc(122页珍藏版)》请在三一办公上搜索。

1、看日记学git系列2009看日记学git来源:整理:sirniu目录看日记学git1看日记学git之序2看日记学git之一3看日记学git之二7看日记学git之三9看日记学git之四13看日记学git之五18看日记学git之六19看日记学git之七28看日记学git之八29看日记学git之九(总结)31看日记学git之十一39看日记学git之十二43看日记学git之十三49看日记学git之十四50看日记学git之十五52看日记学git之十六53看日记学git之十七56看日记学git之十八(点睛)58看日记学git之十九63看日记学git之二十67看日记学git之二十一70看日记学git之二十二

2、87看日记学git之二十三90看日记学git之二十四97看日记学git之二十五102看日记学git之二十六108看日记学git之二十七109看日记学git之二十八115看日记学git之二十九116看日记学git之三十118看日记学git之随笔笔记119看日记学git之序虽然五分钟系列才刚刚到第十集,但是由于项目的需要,版本控制系统的学习迫在眉睫虽然rcs、cvs、svn都是众多项目开发的主力,但是似乎git在众多经典项目中扮演的角色越来越重要。git相比较于其他vcs(version control system)的最大优点就是“分布式”。这些特点一定会在后续的看日记学git系列中提到:)敬请

3、期待rocrocket目前的水平是这样的:曾经用过cvs来做项目,目前在使用svn。完全没有接触过git。希望学习git的朋友们,可以随着我一起来了解、深入、精通git。(也有可能rocrocket能力有限,永远无法到达精通的地步 不是谦虚_)也希望能和大家在的看日记学git系列文章中交流,大家多多留言!3x!看日记学git之一今天是“git第一天”,和我“从零开始”吧!1我用命令rpm -qa|grep i git查看一下我的机器是否安装了git:rocrocketwupengchong $ sudo su -rootwupengchong # rpm -qa|grep -i gitlibc

4、apseo-0.2.0-0.1.20080603gita6ec446.fc9.i386libcaptury-0.3.0-0.1.20080323gitcca4e3c.fc9.i386xorg-x11-drv-nouveau-0.0.10-2.20080408git0991281.fc9.i386xorg-x11-drv-digitaledge-1.1.1-1.fc9.i386此处grep命令使用-i是表示不区分大小写,这样的话无论是大写小写的git/GIT/GiT都不会逃过grep的法眼。结果发现了一些似乎使用git管理的开发项目,还有一些包含git字符的其他包,但就是没发现git包。看来我需

5、要安装一个!2如果使用fedora的yum来安装git,应该是相当简单。如果你是ubuntu,那就更简单了,用apt-get就可以。如果是gentoo的话,我想可以用emerge吧。源码安装的话,大家可以参考git官网看看。我当然毫无悬念的选择yum:rootwupengchong # yum list|grep gitgit.i386 1.5.5.1-1.fc9 updates-newkeygit-all.i386 1.5.5.1-1.fc9 updates-newkeygit-arch.i386 1.5.5.1-1.fc9 updates-newkeygit-cvs.i386 1.5.5.

6、1-1.fc9 updates-newkeygit-daemon.i386 1.5.5.1-1.fc9 updates-newkeygit-email.i386 1.5.5.1-1.fc9 updates-newkeygit-gui.i386 1.5.5.1-1.fc9 updates-newkeygit-svn.i386 1.5.5.1-1.fc9 updates-newkeygitk.i386 1.5.5.1-1.fc9 updates-newkeygitweb.i386 1.5.5.1-1.fc9 updates-newkey此处的grep命令使用了符号,表示后面的字符串需要在每行的最开

7、头位置,于是我们得到了如上的一大串git软件包。首先我能肯定的git.i386是必然需要安装的,它一定是git的主包,但诸如all、arch、cvs等等这些包到底是起什么作用呢?我有些迷惑了。于是,不得不求助baidu了。原来:git包是git的核心程序,它只包括最小的依赖关系,如果只安装git包的话,那么一些git的外围扩展将无法使用。git-all包包括了所有的集成在git上的外围扩展功能。安装了这个包,你就万事大吉了!git-arch包是为了兼容arch仓库的。大家或许听说过linux的发行版本arch,但现在说的arch和这个发行版本似乎没有必然关系。git-arch中的arch是gn

8、u arch,它是一个类似于cvs、sccs、svn的版本控制系统。git-arch包用于支持从gnu arch仓库导入到git仓库。git-cvs包用于支持从cvs仓库导入到git仓库。git-daemon包用于支持用户使用git:/形式的命令来访问git仓库。git-email包支持使用git发送邮件。(这个功能用处在哪里呢?我也不太清楚。慢慢研究中 如果哪位朋友会,在下面留个言)git-gui包是一个基于Tk的git程序,也就是说是带有GUI的,可以用鼠标点击操作的git。git-svn包用于支持从svn仓库导入到git仓库。gitk包是一个带有Tcl/Tk GUI的可以用来浏览git仓

9、库历史信息的桌面程序。(如果你对git仓库这个词没有概念的话,不要急,后面会说到。现在我们的目的就是要把git安装上。)gitweb包则是一个成熟的基于web的用于git仓库管理的web程序。3知道了每一个包的作用后,我们就来安装吧!rootwupengchong # yum install git-all.i386Dependencies Resolved=Package Arch Version Repository Size=Installing:git-all i386 1.5.5.1-1.fc9 updates-newkey 9.0 kInstalling for dependenc

10、ies:cvsps i386 2.1-6.fc9 fedora 55 kemacs-common i386 1:22.2-5.fc9 updates-newkey 19 Memacs-git i386 1.5.5.1-1.fc9 updates-newkey 53 kgit i386 1.5.5.1-1.fc9 updates-newkey 3.5 Mgit-arch i386 1.5.5.1-1.fc9 updates-newkey 28 kgit-cvs i386 1.5.5.1-1.fc9 updates-newkey 69 kgit-email i386 1.5.5.1-1.fc9 u

11、pdates-newkey 28 kgit-gui i386 1.5.5.1-1.fc9 updates-newkey 177 kgit-svn i386 1.5.5.1-1.fc9 updates-newkey 71 kgitk i386 1.5.5.1-1.fc9 updates-newkey 79 kperl-Error noarch 1:0.17012-2.fc9 fedora 27 kperl-Git i386 1.5.5.1-1.fc9 updates-newkey 18 kperl-TermReadKey i386 2.30-6.fc9 fedora 33 ksubversion

12、-perl i386 1.4.6-7 fedora 893 ktla i386 1.3.5-5.fc9 fedora 353 kTransaction Summary=Install 16 Package(s)Update 0 Package(s)Remove 0 Package(s)Total download size: 24 MIs this ok y/N:上面列出了要安装的包和依赖,真是不小,24M!点y安装!今天就到这里。今把git邀请到家了。先让它休息休息,明天继续看日记学git之二昨天将git安装到了机器了。今天起和大家一起学习下git到底是个什么东西。查了一下百度百科和维基百科

13、。git是一个版本控制系统。官方的解释是:版本控制(Revision control)是一种软件工程技巧,籍以在开发的过程中,确保由不同人所编辑的同一档案都得到更新。按我的白话文解释就是:一群志同道合的人身处祖国各地,希望来合作开发一个项目,假设这个项目是使用c语言写的(当然用任何语言都可以的)。那么大家怎么合作呢?用信件?效率太低。用邮件,不好实现多人沟通。用google group吧,可开发阶段中的源代码没法科学管理。用自建的网站吧,需要人力物力财力来支撑阿。这个时候版本控制系统就派上用场了。它可以让一个团队里的不同的人在不同地点、不同时间开发和改进同一个项目,并且在大部分的时间里,版本控

14、制系统会聪明的帮你把不同的人在不同地点不同时间修改的代码融合到项目中去。(当然在一些特殊的情况,还是需要人去决定到底哪些代码需要加入到项目中,这个在后面讨论不迟,先让大家对版本控制有一个好印象,呵呵)知道了版本控制系统的优点之后,下面就要具体实践和体验了。建议你选用的版本控制系统包括:rcs,cvs,svn,git,Mercurial,Bazzar等等。当然git,Mercurial和Bazzar都是属于分布式版本控制系统。下面是一些网友对于这些版本控制系统评论的只言片语:1) svk配合svn可以实现分布式的版本控制。2) 我是从SVN转到Git下的。我想Git的优势是速度飞快,谁用谁知道!

15、3) git的确是最快的,bzr慢的要死4) SVN 在 windows 下有 TortoiseSVN5) git 有 Windows 版本,在 google code 上的项目。6) 大家可以试试国内提供的git服务。知道了版本控制系统的作用了,就要进入“使用git”了。今天就到这里。明天继续。看日记学git之三昨天了解了一些关于版本控制系统的概念,知道了到底版本控制系统是用在哪些方面了。从今天我们开始重点关注git这个版本控制系统的应用了。为了学习git,我首先会登录到google查询git的官网地址,是http:/git.or.cz/。毕竟git官方网站是最权威的学习git、下载git和

16、更新git的地方嘛,其中的Documentation链接是用于用户入门和进阶的地方。最先映入眼帘的是这样一句话:git the stupid content tracker。呵呵 你可能会认为怎么可以把stupid用在git上呢?其实,stupid在这里应该解释为“傻瓜式的”,而并非是你想象的那个意思_(知你者,我也)。对的,git就是一个傻瓜式的内容跟踪器。其次,你会看到官网对于“学习路线的推介”:新手请浏览gittutorial(7),然后是Everyday Git(包括了常用命令),接着是”man git-commandname”,cvs用户需要看gitcvs-migration(7),

17、需要更全面的了解git请看Git Users Manual。如果你希望用“男人”来获取帮助,那么基本格式是这样:man git-commandname比如man git-log就是获取git日志方面的信息;man git-commit就是获取“提交项目”方面的信息。如果你连log或者commit都不知道,那也没关系,先man git看看都有哪些命令就可以了。我将按照官网的说明开始我的学习“新手请浏览gittutorial(7)”。在gittutorial(7)里将会涉及到如何导入一个新的项目。(当然如果你只是希望了解如何获取一个项目开发的代码,那么你完全可以只阅读The Git Users M

18、anual的前两章节。)1首先你最好把自己介绍给git系统,比如自己的姓名阿、email阿。命令是这样的:git config global user.name “Your Name”git config global user.email “you”我照例执行:rootwupengchong # git config global user.name “rocrocket”rootwupengchong # git config global user.email “wupengchong”2下面是学习如何导入一个新的git项目。现在我手头已经有了一个伙伴刚刚用email传给我的用c语言编写

19、的项目(假设只有main.c一个文件),而且这个项目的全部代码和资源都放在rocrocket目录下,我将用下面的步骤来导入这个项目:(黑体字为重点)rootwupengchong git-study#cd rocrocket/rootwupengchong rocrocket#git initInitialized empty Git repository in .git/rootwupengchong rocrocket#ls -a. .gitmain.crootwupengchong rocrocket#git add .rootwupengchong rocrocket#git comm

20、itCreated initial commit df1d87d: This is the first git project.1 files changed, 6 insertions(+), 0 deletions(-)create mode 100644 main.cgit init命令用于初始化当前所在目录的这个项目,shell返回的提示表明已经建立了一个.git隐藏目录来保存这个项目目前的进展信息。我们可以用ls -a看到它。git add .这个命令要求git给我目前的这个项目制作一个快照snapshot(快照只是登记留名,快照不等于记录在案,git管快照叫做索引index)。快照

21、一般会暂时存储在一个临时存储区域中。git commit用于将快照里登记的内容永久写入git仓库中,也就是开发者已经想好了要提交自己的开发成果了。在输入git commit并按回车时会转到一个vi窗口,要求开发者输入这次提交的版本和开发信息。意思就是说这个项目目前的版本是多少,已经完成了哪些功能,还有哪些功能是需要以后完成的等等信息(如果你不介意,当然也可以写上你的感情日记,也不会有人管你,只要你的开发伙伴可以忍受就好)。git commit的日志编辑看日记学git之四这次我们来研究“改进代码之后怎么提交给git”。还记得在之三中我们项目的main.c吧,其中的内容其实就是一个hellowor

22、ld:rootwupengchong rocrocket# cat -n main.c1 #include2 int main()3 4 printf(”hello world!n”);5 return 0;6 这个时候,我来对main.c进行一些修改,在printf语句前加入一行:printf(”Version: 0.01n”);于是程序变成了这样:rootwupengchong rocrocket# cat -n main.c1 #include2 int main()3 4printf(”Version: 0.01n”);5 printf(”hello world!n”);6 retur

23、n 0;7 接下来的两道工序主要是由开发者最后确认一下“自己的修改”:rootwupengchong rocrocket#git diff cachedrootwupengchong rocrocket#这个git diff cached是用来查看index file和仓库之间代码的区别的。由于我们目前只是在working tree里做了修改,还没有报告给index file,所以使用此命令显然会输出空信息。而如果省略cached选项的话,就是比较working tree和index file的区别,由于我们的确在working tree里做了修改,所以使用git diff后会输出修改信息。(

24、可能有些读者不知道working tree是什么意思,其实很简单,通俗的说,它就是你的源代码文件,在这个例子里也就是main.c文件喽)rootwupengchong rocrocket#git diffdiff git a/main.c b/main.cindex 3a88d8c.e0fe92e 100644 a/main.c+ b/main.c -1,6 +1,7 #includeint main()+printf(”Version: 0.01n”);printf(”hello world!n”);return 0;(至于git diff的输出内容我们现在不必研究太深,只要知道这些信息表示

25、的是修改后和修改前的不同之处就可以了)使用git diff了解了不同之后,还可以使用git status命令来获取整体改动的信息:rootwupengchong rocrocket# git status# On branch master# Changed but not updated:# (use “git add ” to update what will be committed)# modified: main.c#no changes added to commit (use “git add” and/or “git commit -a”)可以看到提示信息“changed bu

26、t not updated”,就是说git发现你有已经修改了但还未git add的内容。如果git提示说“Changes to be committed”,那就是表明git发现了你已经git add但还未git commit的内容。如果git提示说“Untracked files”,那么就是你增加了新文件或者在某个子目录下增加了新文件。下面该进入提交阶段了。首先运行rootwupengchong rocrocket# git add main.c这句是要告诉git,我已经修改了main.c文件,你(指git)去检查一下。当然,如果你新增加了一个文件,比如new.c,也需要在这里先执行git a

27、dd new.c告诉git。提交我的工作:rootwupengchong rocrocket# git commitCreated commit ecf78d1: This is the second version.1 files changed, 1 insertions(+), 0 deletions(-)至此,我的修改工作完成了,而且也顺利地提交给了git。还是不放心?来查查:rootwupengchong rocrocket#git logcommit ecf78d1b3603d0f5015e8b14bee69870db6459e1Author: rocrocket Date: Th

28、u Sep 18 15:39:47 2008 +0800This is the second version.Version 0.02commit 3b1e328ad80caebe7fe2f4229e247d2ebe669cd8Author: rocrocket Date: Thu Sep 18 15:32:53 2008 +0800This is the first git project.At 20080916用git log可以查看开发日志!看到黑体字了吧,Version0.02就是我刚才在git commit时输入的新信息。这已经是我们项目的第二个开发版本了。(成就感油然而生)总结一下

29、如果修改了项目代码,先git add你修改过的文件,再git diff并git status查看确认,然后git commit提交,然后输入你的开发日志,最后git log再次确认。现在教给你一个偷懒方法,那就是git commit -a,这个命令可以直接提交所有修改,省去了你git add和git diff和git commit的工序,可谓一条龙服务。但是,此处有一点应该注意,那就是git commit -a无法把新增文件或文件夹加入进来,所以,如果你新增了文件或文件夹,那么就要老老实实的先git add .,再git commit喽。此处非常感谢freeren的提醒对了,针对开发日志,要说

30、一句:切记写开发日志的时候,第一行一定要是少于50字的开发概括信息,而且第二行务必是空行,第三行开始才可以开始细致描述开发信息。这是因为很多版本服务系统中的email机制都会选取log中的第一行为邮件题目。(你应该明白了吧:)ps:我可能在此前也没有太注意关于日志写法的问题,今后也要避免错误:)=看日记学git之五接着上次的话题,先谈一下git-add命令。在其他的版本控制系统中,add命令往往是用在有新文件加入时。而在git中,add命令似乎更简单了,只要是文件有改动,无论是这个文件被修改的还是被新加入的,都可以使用add来进行登记。接着谈log命令。最简单的查询开发日志的方法就是git l

31、og。但如果你觉得git log给出的信息太单薄了,可以使用git log -p,这样git不但会给出开发日志,而且会显示每个开发版本的代码区别所在。看日记学git之六上次的内容比较少,主要是想调节一下大家的心情,总是在大量的文字之间徘徊,身心俱惫。(呵呵,想偷懒有太多种理由,其实主要原因是昨天参与了SFD北邮站的活动的组织工作,晚上回家实在没有精力钻研git了)这部分主要关注:如何管理分支。首先要树立这样一种思想,软件开发不是一线到底的,而是有许多曲折的路要走的。我们如何保证走上曲折的道路后能够回归正确的道路呢?可以利用git的分支功能。(当然,事情都有两面性,有时候误认为曲折的道路最后发现

32、是正确的道路。呵呵 各种情况,git也都全想到了)还是接着我们之前的main.c的项目走。我想试着开发一个报时功能加入到main.c中,但我不保证这个功能一定能够实现。这个时候可以运行git branch命令来开启一个实验分支:rootwupengchong rocrocket#git branch experimentalrootwupengchong rocrocket#好了,分支建立完毕!我来查看一下:rootwupengchong rocrocket#git branchExperimental* master看到喽,直接输入git branch,不加任何后续参数,就表示让git列出所

33、有已存在的分支。前面带“星号”的分支表示当前所在的分支。好,我要进行报时功能的开发,当然我就要切换到experimental分支:rootwupengchong rocrocket# git checkout experimentalSwitched to branch “experimental”好了,正如一小段英文所示,我们已经利用checkout命令成功切换到了experimental分支。好,现在就可以修改当前文件来开发我的报时功能了。(_,我现在是走在曲折的路上了)修改之后的main.c如下:rootwupengchong rocrocket# cat -n main.c1 #inc

34、lude2 #include3 int main()4 5 time_t mytime;6 struct tm *mylocaltime;7 mytime=time(NULL);8 mylocaltime=localtime(&mytime);9 printf(”Year:%dn”,mylocaltime-tm_year+1900);10 printf(”Month:%dn”,mylocaltime-tm_mon+1);11 printf(”Day:%dn”,mylocaltime-tm_mday);12 printf(”Hour:%dn”,mylocaltime-tm_hour);13 pr

35、intf(”Min:%dn”,mylocaltime-tm_min);14 printf(”Second:%dn”,mylocaltime-tm_sec);15 printf(”Version: 0.02n”);16 printf(”Hello world!n”);17 return 0;18 黑体为新加的内容。好了,我的报时功能已经完成了。看来这个分支是可行的:)运行此程序,运行结果如下:rootwupengchong rocrocket# ./a.outYear:2008Month:9Day:21Hour:11Min:17Second:4Version: 0.02Hello world!O

36、K!运行也很完美。我可以完全的确认“这个走在分支上的项目”完全在正确的道路上。(话语有点拗口,希望你能明白)下面的任务就是提交程序到分支项目:(注意虽然已经确认了分支的正确性,但还是不能着急报告给“主干道”,而还要先在分支上提交工作)rootwupengchong rocrocket# git commit -aCreated commit 0dff98a: This is a branch.1 files changed, 11 insertions(+), 0 deletions(-)然后就可以切换到“主干道”了:rootwupengchong rocrocket# git checkou

37、t masterSwitched to branch “master”(走在主干道上的你,无论使用log或是status命令都无法看到刚才在experimental分支所进行的工作。)为了让git处理分支的本领展现的淋漓尽致,我们现在在主干道上再做一些改进。我们希望程序在最开始执行的时候输出一行“Welcome to ”。这行很简单,在主干道上完成后,main.c的内容如下:rootwupengchong rocrocket# cat -n main.c1 #include2 int main()3 4printf(”Welcome to n”);5 printf(”Version: 0.02

38、n”);6 printf(”Hello world!n”);7 return 0;8 然后在主干道上使用git commit -a提交!好!我们清理一下思路。在experimental分支上有一个增加了报时功能的main.c,而在主干道上有一个增加了welcome的main.c。它们都进行了git commit -a命令。下面,我们就来合并“分支”和“主干道”(你猜会发生什么?):rootwupengchong rocrocket# git merge experimentalAuto-merged main.cCONFLICT(content): Merge conflict in main

39、.cAutomatic merge failed; fix conflicts and then commit the result.报错了!因为我看到了conflict和failed这样的字眼。看来主干道上加入的welcome和分支干道产生了冲突。我们决定来修改主干道的welcome语句到文章的最后部位。主干道的main.c此时为:rootwupengchong rocrocket# cat main.c#include#includeint main()tm_year+1900);printf(”Month:%dn”,mylocaltime-tm_mon+1);printf(”Day:%d

40、n”,mylocaltime-tm_mday);printf(”Hour:%dn”,mylocaltime-tm_hour);printf(”Min:%dn”,mylocaltime-tm_min);printf(”Second:%dn”,mylocaltime-tm_sec); experimental:main.cprintf(”Version: 0.02n”);printf(”Hello world!n”);return 0;请务必注意代码中三行红粗体字,显而易见这是git在告诉我们发生冲突的地点,中间的加黑的“=”表示两端冲突代码的分隔。可以看出git迷惑之处在于它不知道是把welcome这行放在前面还是把报时功能这段放在前面。呵呵 git正在迷惑中现在轮到我们人类来帮助告诉git我们想要什么了,修改这段冲突代码直到你自己满意为止吧。修改后的main.c如下:rootwupengchong rocrocket# cat -n main.c1 #include

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教育教学 > 成人教育


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号