GIT使用教程.docx
- 文档编号:7880962
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:22
- 大小:262.16KB
GIT使用教程.docx
《GIT使用教程.docx》由会员分享,可在线阅读,更多相关《GIT使用教程.docx(22页珍藏版)》请在冰豆网上搜索。
GIT使用教程
GIT使用入门
Part1
第1章基本原理
git是一个版本控制系统。
官方的解释是:
版本控制(Revisioncontrol)是一种软件工程技巧,籍以在开发的过程中,确保由不同人所编辑的同一档案都得到更新。
按我的白话文解释就是:
一群志同道合的人身处祖国各地,希望来合作开发一个项目,假设这个项目是使用c语言写的(当然用任何语言都可以的)。
那么大家怎么合作呢?
用信件?
效率太低。
用邮件,不好实现多人沟通。
用google
group吧,可开发阶段中的源代码没法科学管理。
用自建的网站吧,需要人力物力财力来支撑阿。
这个时候版本控制系统就派上用场了。
它可以让一个团队里的不同的人在不同地点、不同时间开发和改进同一个项目,并且在大部分的时间里,版本控制系统会聪明的帮你把不同的人在不同地点不同时间修改的代码融合到项目中去。
(当然在一些特殊的情况,还是需要人去决定到底哪些代码需要加入到项目中,这个在后面讨论不迟,先让大家对版本控制有一个好印象,呵呵)
知道了版本控制系统的优点之后,下面就要具体实践和体验了。
建议你选用的版本控制系统包括:
rcs,cvs,svn,git,Mercurial,Bazzar等等。
当然git,Mercurial和Bazzar都是属于分布式版本控制系统。
下面是一些网友对于这些版本控制系统评论的只言片语:
1)svk配合svn可以实现分布式的版本控制。
2)我是从SVN转到Git下的。
我想Git的优势是速度飞快,谁用谁知道!
3)git的确是最快的,bzr慢的要死
4)SVN在windows下有TortoiseSVN
5)git有Windows版本,在googlecode上的项目。
6)大家可以试试国内提供的git服务。
那么,简单地说,Git究竟是怎样的一个系统呢?
请注意,接下来的内容非常重要,若是理解了Git的思想和基本的工作原理,用起来就会知其所以然,游刃有余。
在开始学习Git的时候,请不要尝试把各种概念和其他的版本控制系统诸如Subversion和Perforce等相比拟,否则容易混淆每个操作的实际意义。
Git在保存和处理各种信息的时候,虽然操作起来的命令形式非常相近,但它与其他版本控制系统的做法颇为不同。
理解这些差异将有助于你准确地使用Git提供的各种工具。
直接快照,而非比较差异
Git和其他版本控制系统的主要差别在于,Git只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。
这类系统(CVS,Subversion,Perforce,Bazaar等等)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容,请看图1-4。
图1-4.其他系统在每个版本中记录着各个文件的具体差异
Git并不保存这些前后变化的差异数据。
实际上,Git更像是把变化的文件作快照后,记录在一个微型的文件系统中。
每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。
为提高性能,若文件没有变化,Git不会再次保存,而只对上次保存的快照作一连接。
Git的工作方式就像图1-5所示。
图1-5.Git保存每次更新时的文件快照
这是Git同其他系统的重要区别。
它完全颠覆了传统版本控制的套路,并对各个环节的实现方式作了新的设计。
Git更像是个小型的文件系统,但它同时还提供了许多以此为基础的超强工具,而不只是一个简单的VCS。
稍后在第三章讨论Git分支管理的时候,我们会再看看这样的设计究竟会带来哪些好处。
近乎所有操作都可本地执行
在Git中的绝大多数操作都只需要访问本地文件和资源,不用连网。
但如果用CVCS的话,差不多所有操作都需要连接网络。
因为Git在本地磁盘上就保存着所有有关当前项目的历史更新,所以处理起来速度飞快。
举个例子,如果要浏览项目的历史更新摘要,Git不用跑到外面的服务器上去取数据回来,而直接从本地数据库读取后展示给你看。
所以任何时候你都可以马上翻阅,无需等待。
如果想要看当前版本的文件和一个月前的版本之间有何差异,Git会取出一个月前的快照和当前文件作一次差异运算,而不用请求远程服务器来做这件事,或是把老版本的文件拉到本地来作比较。
用CVCS的话,没有网络或者断开VPN你就无法做任何事情。
但用Git的话,就算你在飞机或者火车上,都可以非常愉快地频繁提交更新,等到了有网络的时候再上传到远程的镜像仓库。
同样,在回家的路上,不用连接VPN你也可以继续工作。
换作其他版本控制系统,这么做几乎不可能,抑或非常麻烦。
比如Perforce,如果不连到服务器,几乎什么都做不了(译注:
实际上手工修改文件权限改为可写之后是可以编辑文件的,只是其他开发者无法通过Perforce知道你正在对此文件进行修改。
);如果是Subversion或CVS,虽然可以编辑文件,但无法提交更新,因为数据库在网络上。
看上去好像这些都不是什么大问题,但在实际体验过之后,你就会惊喜地发现,这其实是会带来很大不同的。
时刻保持数据完整性
在保存到Git之前,所有数据都要进行内容的校验和(checksum)计算,并将此结果作为数据的唯一标识和索引。
换句话说,不可能在你修改了文件或目录之后,Git一无所知。
这项特性作为Git的设计哲学,建在整体架构的最底层。
所以如果文件在传输时变得不完整,或者磁盘损坏导致文件数据缺失,Git都能立即察觉。
Git使用SHA-1算法计算数据的校验和,通过对文件的内容或目录的结构计算出一个SHA-1哈希值,作为指纹字符串。
该字串由40个十六进制字符(0-9及a-f)组成,看起来就像是:
24b9da6552252987aa493b52f8696cd6d3b00373
Git的工作完全依赖于这类指纹字串,所以你会经常看到这样的哈希值。
实际上,所有保存在Git数据库中的东西都是用此哈希值来作索引的,而不是靠文件名。
多数操作仅添加数据
常用的Git操作大多仅仅是把数据添加到数据库。
因为任何一种不可逆的操作,比如删除数据,要回退或重现都会非常困难。
在别的VCS中,若还未提交更新,就有可能丢失或者混淆一些修改的内容,但在Git里,一旦提交快照之后就完全不用担心丢失数据,特别是在养成了定期推送至其他镜像仓库的习惯的话。
这种高可靠性令我们的开发工作安心不少,尽管去做各种试验性的尝试好了,再怎样也不会弄丢数据。
至于Git内部究竟是如何保存和恢复数据的,我们会在第九章的“幕后细节”部分再作详述。
三种状态
好,现在请注意,接下来要讲的概念非常重要。
对于任何一个文件,在Git内都只有三种状态:
已提交(committed),已修改(modified)和已暂存(staged)。
已提交表示该文件已经被安全地保存在本地数据库中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。
由此我们看到Git管理项目时,文件流转的三个工作区域:
Git的本地数据目录,工作目录以及暂存区域。
图1-6.工作目录,暂存区域和git目录
每个项目都有一个git目录,它是Git用来保存元数据和对象数据库的地方。
该目录非常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。
从项目中取出某个版本的所有文件和目录,用以开始后续工作的叫做工作目录。
这些文件实际上都是从git目录中的压缩对象数据库中提取出来的,接下来就可以在工作目录中对这些文件进行编辑。
所谓的暂存区域只不过是个简单的文件,一般都放在git目录中。
有时候人们会把这个文件叫做索引文件,不过标准说法还是叫暂存区域。
基本的Git工作流程如下所示:
1.在工作目录中修改某些文件。
2.对这些修改了的文件作快照,并保存到暂存区域。
3.提交更新,将保存在暂存区域的文件快照转储到git目录中。
所以,我们可以从文件所处的位置来判断状态:
如果是git目录中保存着的特定版本文件,就属于已提交状态;如果作了修改并已放入暂存区域,就属于已暂存状态;如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。
到第二章的时候,我们会进一步了解个中细节,并学会如何善用这些状态,以及如何跳过暂存环节。
第二章安装
安装Git
是时候动动手了,不过在此之前得先安装好Git。
有许多安装方式,概括起来主要有两种,一种是通过编译源代码来安装;另一种是使用为特定平台预编译好的安装包。
从源代码安装
若是条件允许,从源代码安装有很多好处,至少可以安装最新的版本。
Git的每个版本都在不断尝试改进用户体验,所以能通过源代码自己编译安装最新版本就再好不过了。
有些Linux版本自带的安装包更新起来并不及时,所以除非你在用最新的distro或者backports,那么从源代码安装其实该算是最佳选择。
Git的工作需要调用curl,zlib,openssl,expat,libiconv等库的代码,所以需要先安装这些依赖工具。
在有yum的系统上(比如Fedora)或者有apt-get的系统上(比如Debian体系的),可以用下面的命令安装:
$yuminstallcurl-develexpat-develgettext-devel\
openssl-develzlib-devel
$apt-getinstallcurl-develexpat-develgettext-devel\
openssl-develzlib-devel
之后,从下面的Git官方站点下载最新版本源代码:
http:
//git-
然后编译并安装:
$tar-zxfgit-1.6.0.5.tar.gz
$cdgit-1.6.0.5
$makeprefix=/usr/localall
$sudomakeprefix=/usr/localinstall
现在已经可以用git命令了,用git把Git项目仓库克隆到本地,以便日后随时更新:
$gitclonegit:
//git.kernel.org/pub/scm/git/git.git
在Linux上安装
如果要在Linux上安装预编译好的Git二进制安装包,可以直接用系统提供的包管理工具。
在Fedora上用yum安装:
$yuminstallgit-core
在Ubuntu这类Debian体系的系统上,可以用apt-get安装:
$apt-getinstalgit-core
在Windows上安装
在Windows上安装Git同样轻松,有个叫做msysGit的项目提供了安装包,可以从GoogleCode的页面上下载安装文件(.exe):
完成安装之后,就可以使用命令行的git工具(已经自带了ssh客户端)了,另外还有一个图形界面的Git项目管理工具。
Part2
Git基础
第三章导入一个新项目
1
首先你最好把自己介绍给git系统,比如自己的姓名阿、email阿。
命令是这样的:
gitconfig--globaluser.name“YourName”
gitconfig--globaluser.email“you@”
我照例执行:
[root@wupengchong~]$gitconfig--globaluser.name“rocrocket”
[root@wupengchong~]$gitconfig--globaluser.email“wupengchong@”
2
下面是学习如何导入一个新的git项目。
新建一个git目录:
$gitmkdirrocrocket
这时你可以去C:
\DocumentsandSettings\Administrator\下查看,是不是多了一个rocrocket文件夹?
现在我手头已经有了一个伙伴刚刚用email传给我的用c语言编写的项目(假设只有main.c一个文件),而且这个项
目的全部代码和资源都放在rocrocket目录下(C:
\DocumentsandSettings\Administrator\rocrocket),我将用下面的步骤来导入这个项目:
(黑体字为重点)
[root@wupengchonggit-study]$cdrocrocket/
[root@wupengchongrocrocket]$gitinit(rocrocket文件下多了一个.git文件夹)
InitializedemptyGitrepositoryin.git/
[root@wupengchongrocrocket]$ls-a
....gitmain.c
[root@wupengchongrocrocket]$gitadd.
[root@wupengchongrocrocket]$gitcommit
Createdinitialcommitdf1d87d:
Thisisthefirstgitproject.
1fileschanged,6insertions(+),0deletions(-)
createmode100644main.c
gitinit命令用于初始化当前所在目录的这个项目,shell返回的提示表明已经建立了一个.git隐藏目录来保存这个项目目前的进展信息。
我们可以用ls-a看到它。
gitadd.这个命令要求git给我目前的这个项目制作一个快照snapshot(快照只是登记留名,快照不等于记录在案,git管快照叫做索引index)。
快照一般会暂时存储在一个临时存储区域中。
gitcommit用于将快照里登记的内容永久写入git仓库中,也就是开发者已经想好了要提交自己的开发成果了。
在输入gitcommit并按回车时会转到一个vi窗口,要求开发者输入这次提交的版本和开发信息。
意思就是说这个项目
目前的版本是多少,已经完成了哪些功能,还有哪些功能是需要以后完成的等等信息(如果你不介意,当然也可以写上你
的感情日记,也不会有人管你,只要你的开发伙伴可以忍受就好)。
第四章提交修改后的文件
这次我们来研究“改进代码之后怎么提交给git”。
还记得在之三中我们项目的main.c吧,其中的内容其实就是一个helloworld:
[root@wupengchongrocrocket]$cat-nmain.c
1#include
2intmain()
3{
4printf(”helloworld!
\n”);
5return0;
6}
这个时候,我来对main.c进行一些修改,在printf语句前加入一行:
printf(”Version:
0.01\n”);
于是程序变成了这样:
[root@wupengchongrocrocket]$cat-nmain.c
1#include
2intmain()
3{
4printf(”Version:
0.01\n”);
5printf(”helloworld!
\n”);
6return0;
7}
接下来的两道工序主要是由开发者最后确认一下“自己的修改”:
[root@wupengchongrocrocket]$gitdiff--cached
[root@wupengchongrocrocket]$
这个gitdiff--cached是用来查看indexfile和仓库之间代码的区别的。
由于我们目前只是在workingtree里做了修改,还没有报告给indexfile,所以使用此命令显然会输出空信息。
而如果省略–cached选项的话,就是比较workingtree和indexfile的区别,由于我们的确在workingtree里做了修改,所以使用gitdiff后会输出修改信息。
(可能有些读者不知道workingtree是什么意思,其实很简单,通俗的说,它就是你的源代码文件,在这个例子里也就是main.c文件喽)
[root@wupengchongrocrocket]$gitdiff
diff–gita/main.cb/main.c
index3a88d8c..e0fe92e100644
—a/main.c
+++b/main.c
@@-1,6+1,7@@
#include
intmain()
{
+printf(”Version:
0.01\n”);
printf(”helloworld!
\n”);
return0;
}
(至于gitdiff的输出内容我们现在不必研究太深,只要知道这些信息表示的是修改后和修改前的不同之处就可以了)
使用gitdiff了解了不同之后,还可以使用gitstatus命令来获取整体改动的信息:
[root@wupengchongrocrocket]$gitstatus
#Onbranchmaster#Changedbutnotupdated:
#(use“gitadd
#
#modified:
main.c
#
nochangesaddedtocommit(use“gitadd”and/or“gitcommit-a”)
可以看到提示信息“changedbutnotupdated”,就是说git发现你有已经修改了但还未gitadd的内容。
如果git提示说“Changestobecommitted”,那就是表明git发现了你已经gitadd但还未gitcommit的内容。
如果git提示说“Untrackedfiles”,那么就是你增加了新文件或者在某个子目录下增加了新文件。
下面该进入提交阶段了。
首先运行
[root@wupengchongrocrocket]$gitaddmain.c
这句是要告诉git,我已经修改了main.c文件,你(指git)去检查一下。
当然,如果你新增加了一个文件,比如
new.c,也需要在这里先执行gitaddnew.c告诉git。
提交我的工作:
[root@wupengchongrocrocket]$gitcommit
Createdcommitecf78d1:
Thisisthesecondversion.
1fileschanged,1insertions(+),0deletions(-)
至此,我的修改工作完成了,而且也顺利地提交给了git。
还是不放心?
来查查:
[root@wupengchongrocrocket]$gitlog
commitecf78d1b3603d0f5015e8b14bee69870db6459e1
Author:
rocrocket
Date:
ThuSep1815:
39:
472008+0800
Thisisthesecondversion.
Version0.02
commit3b1e328ad80caebe7fe2f4229e247d2ebe669cd8
Author:
rocrocket
Date:
ThuSep1815:
32:
532008+0800
Thisisthefirstgitproject.
At20080916
用gitlog可以查看开发日志!
看到黑体字了吧,Version0.02就是我刚才在gitcommit时输入的新信息。
这已经是我们
项目的第二个开发版本了。
(成就感油然而生)
总结一下
如果修改了项目代码,先gitadd你修改过的文件,再gitdiff并gitstatus查看确认,然后gitcommit提交,然后输入你的开发日志,最后gitlog再次确认。
现在教给你一个偷懒方法,那就是gitcommit-a(这个命令貌似不行,有待讨论),这个命令可以直接提交所有修改,省去了你gitadd和gitdiff和gitcommit的工序,可谓一条龙服务。
但是,此处有一点应该注意,那就是gitcommit-a无法把新增文件或文件夹加入进来,所以,如果你新增了文件或文
件夹,那么就要老老实实的先gitadd.,再gitcommit喽。
[此处非常感谢freeren的提醒]
对了,针对开发日志,要说一句:
切记写开发日志的时候,第一行一定要是少于50字的开发概括信息,而且第二行务
必是空行,第三行开始才可以开始细致描述开发信息。
这是因为很多版本服务系统中的email机制都会选取log中的第一行
为邮件题目。
(你应该明白了吧:
))
ps:
我可能在此前也没有太注意关于日志写法的问题,今后也要避免错误:
)
第五章查看日志
接着谈log命令。
最简单的查询开发日志的方法就是gitlog。
但如果你觉得gitlog给出的信息太单薄了,可以使用gitlog-p,这样git不但会给出开发日志,而且会显示每个开发版本的代码区别所在。
第六章分支
这部分主要关注:
如何管理分支。
首先要树立这样一种思想,软件开发不是一线到底的,而是有许多曲折的路要走的。
我们如何保证走上曲折的道路后
能够回归正确的道路呢?
可以利用git的分支功能。
(当然,事情都有两面性,有时候误认为曲折的道路最后发现是正确的道路。
呵呵各种情况,git也都全想到了)
还是接着我们之前的main.c的项目走。
我想试着开发一个报时功能加入到main.c中,但我不保证这个功能一定能够实现。
这个时候可以运行gitbranch命令来开启一个实验分支:
[root@wupengchongrocrocket]$gitbranchexperimental
[root@wupengchongrocrocket]$
好了,分支建立完毕!
我来查看一下:
[root@wupengchongrocrocket]$gitbranch
Experimental
*master
看到喽,直接输入gitbranch,不加任何后续参数,就表示让git列出所有已存在的分支。
前面带“星号”的分支表示当前所在的分支。
好,我要进行报时功能的开发,当然我就要切换到experimental分支:
[root@wupengchongrocrocket]#$gitcheckoutexperimental
Switchedtobranch“experimental”
好了,正如一小段英文所示,我们已经利用checkout命令成功切换到了experimental分支。
好,现在
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- GIT 使用 教程
![提示](https://static.bdocx.com/images/bang_tan.gif)