git教程.docx
《git教程.docx》由会员分享,可在线阅读,更多相关《git教程.docx(29页珍藏版)》请在冰豆网上搜索。
git教程
教程:
在CentOS5上安装Git
Git是Linus.Torvald为了管理Linux内核发起并开发的一个开源分布式版本控件系统,作为分布式版本控制系统的重要代表——Git已经为越来越多的人所认识,它不同于我们熟悉的CVS、SVN和同时分布式控制系统的Mercurial。
既然现在都流行这个Git分布式版本控制系统,我也在服务器上装一个学一下。
首先安装Git依赖的一些包。
yuminstallzlib-devel
yuminstallopenssl-devel
yuminstallperl
yuminstallcpio
yuminstallexpat-devel
yuminstallgettext-devel
接下来,如果你已经安装过Curl了,那么跳过这一步,没有的话,就装一下。
(可以yum安装)
wgethttp:
//curl.haxx.se/download/curl-7.18.0.tar.gz
tarxzvfcurl-7.18.0.tar.gz
cdcurl-7.18.0
./configure
make
makeinstall
确定一下ld.so.conf文件里有/usr/local/lib,这个是为git-http-push准备的。
vi/etc/ld.so.conf
#插入下面的代码
/usr/local/lib
保存文件,接着运行:
/sbin/ldconfig
最后,我们下载Git并安装它
wgethttp:
//www.codemonkey.org.uk/projects/git-snapshots/git/git-latest.tar.gz
tarxzvfgit-latest.tar.gz
cdgit-{date}(这里的{date}指的是版本的时间)
autoconf(如果终端提示nocommand的话就yuminstallautoconf,千万不要以为文件夹中有makefile就好直接make了,不然会出错的)
./configure--with-curl=/usr/local
make
makeinstall
初识版本控制系统Git
Git是用于Linux内核开发的版本控制工具。
与常用的版本控制工具CVS,Subversion等不同,它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。
本文是《GitCommunityBook》的译者刘辉在InfoQ上发表的一篇专栏文章,整个系列名为《Git历险记》。
本文是系列第一篇,对Git的历史、特点和作者的使用心得进行了概述。
以下为正文。
作为分布式版本控制系统的重要代表——Git已经为越来越多的人所认识,它相对于我们熟悉的CVS、SVN甚至同时分布式控制系统的Mercurial,有哪些优势和不足呢。
Git是Linus.Torvald为了管理Linux内核发起并开发的一个开源分布式版本控件系统(DVCS)。
从2002年起,Linux内核一直使用BitKeeper来进行版本管理,但是在2005年BitKeeper和Linux内核开源社区的合作关系结束,BitKeeper再也不能免费使用了,这迫使Linus决定开发一个开源界自已的版本控制系统。
传统的SVN、CVS等版本控制系统,只有一个仓库(repository),用户必须要连上这个仓库才能开始提交;而Git之类的分布式版本控制系统(当然也还包括BitKeeper、Mercurial等等),它的每个工作目录都包含一个完整的仓库,它们可以支持离线工作,先把工作提交到本地仓库后再提交上远程的服务器上的仓库里。
分布式的处理也让开发更为便捷,开发人员可以很方便的在本地创建分支来进行日常开发,每个人的本地仓库都是平等且独立,不会因为你的本地提交而直接影响别人。
老实说,Git的速度是我用的版本控制系统中最快的(SVNMercurialGit)。
我这里说的速度,包括本地提交(commit)、本地签出(checkout)、提交到远程仓库(gitpush)和从远程仓库获取(gitfetch,gitpull);它的本地操作速度和本地文件系统在一个级别,远程仓库的操作速度和SFTP文件传输在一个级别。
这当然和Git的内部实现机制有关,这里就不多展开了。
我们在学一门新的语言时,往往是从一个“helloworld”程序开始的,那么Git历程也就从一个“helloGit”开始吧。
我们首先打开Git的命令行:
windows下是点击“GitBash快捷方式”;Linux或是Unixlike平台的话就直接打开命令行界面就可以了。
备注:
$符号后面的字符串代表的是命令行输入;命令行输入后的以#开始的黑体字符串代表注释;其它的部分则是命令行输出。
我们先用建一个仓库吧:
$mkdirtestGit#建立仓库目录
$cdtestGit#进入仓库目录
$gitinit#这会在当前的目录下建一个仓库
InitializedemptyGitrepositoryine:
/doc/Git/test/testGit/.git/
好的,前面的三行命令就建立了一个本地的Git仓库。
这个仓库现在是一个空的仓库。
我们在命令行下执行:
$gitstatus#查看当前仓库的状态
#Onbranchmaster(在master分支上)
#
#Initialcommit
#
nothingtocommit(create/copyfilesanduse"gitadd"totrack)
(现在没有任何台被提交的文件,复制或创建新的文件,再用”gitadd”命令添加到暂存区中)
$gitlog#查看当前仓库的历史日志
fatal:
baddefaultrevision'HEAD'
(由于仓库里没有任提交在里面,所以它会报这个错。
BTW:
这种提示是不是有点不友好呀:
))
现在就让我们在这个仓库里添加点内容吧。
$echo“helloGit”>readme.txt#建立一个含有helloGit的文本文件
$gitaddreadme.txt#将readme.txt添加到暂存区中
$gitstatus#查看当前仓库的状态
#Onbranchmaster
#
#Initialcommit
#
#Changestobecommitted:
(暂存里下次将被提交的修改)
#(use"gitrm--cached..."tounstage)
#
#newfile:
readme.txt
#
好的,文件即然被暂存到暂存区中,我们现在就可以把它提交到仓库里面去:
)
$gitcommit-m"projectinit"#将刚才的修改提交到本地仓库中
[master(root-commit)8223db3]projectinit
1fileschanged,1insertions(+),0deletions(-)
createmode100644readme.txt
$gitstatus
#Onbranchmaster
nothingtocommit(workingdirectoryclean)
(现在这个工作目录里没有什么要提交的东东,它是整洁的)
现在你执行一下gitlog命令就会看到刚才的提交记录
$gitlog
commit8223db3b064a9826375041c8fea020cb2e3b17d1
Author:
liuhui998
Date:
SatJan118:
12:
382011+0800
projectinit
“8223db3b064a9826375041c8fea020cb2e3b17d1”这一串字符就是我们这次创建的提交的名字。
看起来是不是很熟,如果经常用电驴的朋友就会发现它就是和电驴里内容标识符一样,都是SHA1串。
Git通过对提交内容进行SHA1Hash运算,得到它们的SHA1串值,作为每个提交的唯一标识。
根据一般的密码学原理来说,如果两个提交的内容不相同,那么它们的名字就不会相同;反之,如果它们的名字相同,就意味着它们的内容也相同。
现在我想改一下仓库里文件的内容,现提交到仓库中去
$echo"GitisCool">>readme.txt#在文件的最后添加一行
$gitstatus#查看当前仓库的状态
#Onbranchmaster
#Changedbutnotupdated:
(修改了,但是还没有暂存的内容)
#(use"gitadd..."toupdatewhatwillbecommitted)
#(use"gitcheckout--..."todiscardchangesinworkingdirectory)
#
#modified:
readme.txt
#
nochangesaddedtocommit(use"gitadd"and/or"gitcommit-a")
(没有修改可以被提交,使用“gitadd”命令添加文件到暂存区,或是使用“gitcommit-a”命令强制提交当前目录下的所有文件)
OK,即然我们修改了仓库里被提交的文件,那么我想看一下我们
到底改了哪些地方,再决定是否提交。
$gitdiff#查看仓库里未暂存内容和仓库已提交内容的差异
diff--gita/readme.txtb/readme.txt
index7b5bbd9..49ec0d6100644
---a/readme.txt
+++b/readme.txt
@@-1+1,2@@
helloGit
+GitisCool
很好,正如我们所愿,我们只是在readme.txt的最后一行添加了一行“GitisCool”。
好的,我们现在再把readme.txt放到暂存区里:
$gitaddreadme.txt
我们现在看一下仓库的状态:
$gitstatus
#Onbranchmaster
#Changestobecommitted:
#(use"gitresetHEAD..."tounstage)
#
#modified:
readme.txt
#
可以提交了:
$gitcommit-m"GitisCool"
[master45ff891]GitisCool
1fileschanged,1insertions(+),0deletions(-)
(一个文件被修改,一行插入,零行删除)
再看一下新的日志:
$gitlog
commit45ff89198f08365bff32364034aed98126009e44
Author:
liuhui998
Date:
SatJan118:
17:
072011+0800
GitisCool
commit8223db3b064a9826375041c8fea020cb2e3b17d1
Author:
liuhui998
Date:
SatJan118:
12:
382011+0800
projectinit
“45ff89198f08365bff32364034aed98126009e44”这个就是我们刚才提交修改时创建的提交。
大家这么一路看过来,是不是有点糊涂了。
不过没有关系,如果你的电脑装了Git,那么你把上面的这些命令全部执行一下遍就会对它有感性的认识了。
Git历险记
(2):
Git的安装和配置
《GitCommunityBook》的译者刘辉在上一篇Git历险记
(1):
初识版本控制系统Git讲了一个“helloGit”的小故事。
使广大朋友对Git有了一定了解。
但不少朋友对Git还是有很多疑问。
本文是Git历险记的第二篇,从这一篇开始,刘辉将从Linux(*nix)平台和Windows平台介绍起,,更深入讲解Git的下载、安装和配置。
以下是正文。
从这一篇开始,我就将比较“啰嗦”的和大家一起从零开始经历Git使用的每一步,当然对我而言这也是一个重新认识Git的过程。
使用Git的第一步肯定是安装Git,因为在多数平台上Git是没有预装的。
我平时主要的工作环境是windows和Linux(ubuntu),我想看这篇文章的同学多半也是在这两个平台下工作;下面我讲一下如何在这两个平台下安装和配置Git。
BTW:
如果是苹果平台的用户的安装可以参看一下这里(1,2),配置和命令行的使用与windows、Linux(*nix)平台差别不大。
Linux(*nix)平台
Linus开发Git的最初目的就是为了开发Linux内核服务的,自然它对Linux的平台支持也是最棒的。
在Linux下安装Git大约有几种方法:
从源代码开始(这种方法也适合于多数*nix平台)
从Git官网的下载页面下载它最新稳定版的源代码,就可以从源代码开始编译、安装:
$wgethttp:
//kernel.org/pub/software/scm/git/git-1.7.3.5.tar.bz2
$tar-xjvfgit-1.7.3.5.tar.bz2
$cdgit-1.7.3.5
$makeprefix=/usrall;#prefix设置你的Git安装目录
$sudomakeprefix=/usrinstall;#以root权限运行
为了编译Git的源代码,我们还需要一些库:
expat、curl、zlib和openssl;除了expat外,其它的库可能在你的机器上都安装了。
使用安装包管理器(apt或yum)
在fedora等系统下用yum:
$yuminstallgit-core
在debian,ubuntu等系统下用apt:
$apt-getinstallgit-core
有时候,你系统里的安装包管理器出现了问题,或是要安装Git的机器不能上网、没有编译器的话,你可以从下面的站点去下载“.deb”或“.rpm”的安装包:
●RPMPackages
●StableDebs
Windows平台
windows平台有两个模拟*nixlike运行环境的工具:
cygwin,msys;Git在cygwin,msys下都有相应的移植版本。
我个人觉得msys平台下的msysGit最好用,现在我在windows下也是用的这个版本。
很多同学可能要问,现在windows下有那多Git用户,为什么Git不直接出一个windowsnative版。
俺当年翻看了一下Git的源代码,它里面使用了大量的*nix平台的nativeapi,而这些api在windows下是没有的,所以必须要用cygwin、msys这样的一个中间层来满足软件移植的要求。
下面我“啰嗦”一下如何在windows下安装msysGit。
下载
到它的下载页面去下载一个最新的完整安装包,笔者在撰写本文时下载的是这个。
安装
安装的过程没有什么好说的,一般是开始安装后,一路的点击“下一步”。
由于windows平台的换行符(CRLF)和Linux(*nix)平台的换行符(LF)不同,那么在windows下开发其它平台软件的朋友有一个地方要注意(见下图):
在这里一最好选“Checkoutas-is,commitas-is”这个选项,这样,Git就不会修改你代码的换行符风格。
以前有个朋友因为选错了这个选项,以致他在windows平台下的一签出(checkout)其它平台的代码,就会显示”已修改“(modified),不过后来可能msysGit也认识到这个问题了,就把默认选项改成了这个选项。
BTW:
其实前面两项也是有用的,如果对windows和Linux(*nix)平台如何处理换行符很熟悉的话,也可以尝试一下前面两个选项:
)
配置Git
在Linux下和windows下配置Git的方法差不多,只是在Linux下,可以在命令行里直接使用gitconfig进行配置,而在windows下则要先打开“GitBash”,进入msysGit命令行界面,再用gitconfig命令进行相应的配置操作。
好了,前面安装好了Git,现在我们开始配置:
第一个需要配置的就是用户的用户名和email,因为这些内容会出现在你的每一个提交(commit)里面的,像下面这样:
$gitlog#我们用gitlog查看当前仓库的提交(commit)日志
commit71948005382ff8e02dd8d5e8d2b4834428eece24
Author:
author
Date:
ThuJan2012:
58:
052011+0800
Projectinit
下面的这两行命令就是设置用户名和email:
$gitconfig--globaluser.nameauthor#将用户名设为author
$gitconfig--globaluser.emailauthor@#将用户邮箱设为author@
Git的配置信息分为全局和项目两种,上面命令中带了“--global"参数,这就意味是在进行全局配置,它会影响本机上的每个一个Git项目。
大家看到,上面我们用的是@corpmail(公司邮箱);但是有时候我们可能也参与了一些开源项目,那么就需要新的用户名和自己的私人邮箱,Git可以为每个项目设定不同的配置信息。
在命令行环境,进入Git项目所在目录,执行下面的命令:
$gitconfig user.namenickname#将用户名设为nickname
$gitconfig user.emailnickname@#将用户邮箱设为nickname@
Git的设计哲学和Linux(*nix)一样,尽量的使用“文本化”(Textuality);它里面尽量用文本化的形式存储信息,对于配置信息也更是如此,用户的这些配置信息全部是存储在文本文件中。
Git的全局配置文件是存放在"~/.gitconfig"(用户目录下的.gitconfig)文件中:
我们用cat、head命令查看全局配置信息文件,并假设相关配置信息存储在文件的前3行(当然也有可能不在前3行,这里只是为了方便表示)
$cat~/.gitconfig|head-3
[user]
name=author
email=author@
而项目配置文件是存放在Git项目所在目录的".git/config"文件中,这里也像上面一样用cat、head命令查看一下:
$cat.git/config|head-3
[user]
name=nickname
email=nickname@
如果大家对于Git熟悉后,可以直修改”~/.gitconfig”,”.git/config”这两个文件进行配置。
Git历险记(3):
创建一个自己的本地仓库
如果我们要把一个项目加入到Git的版本管理中,可以在项目所在的目录用gitinit命令建立一个空的本地仓库,然后再用gitadd命令把它们都加入到Git本地仓库的暂存区(stageorindex)中,最后再用gitcommit命令提交到本地仓库里。
创建一个新的项目目录,并生成一些简单的文件内容:
$mkdirtest_proj
$cdtest_proj
$echo“hello,world”>readme.txt
在项目目录创建新的本地仓库,并把项目里的所有文件全部添加、提交到本地仓库中去:
$gitinit#在当前的目录下创建一个新的空的本地仓库
InitializedemptyGitrepositoryin/home/user/test_proj/.git/
$gitadd.#把前目录下的所有文件全部添加到暂存区
$gitcommit-m'projectinit'#创建提交
[master(root-commit)b36a785]projectinit
1fileschanged,1insertions(+),0deletions(-)
createmode100644readme.txt
Git目录的结构
gitinit命令在项目的顶层目录中建了一个名为:
“.git”的目录,它的别名是“Git目录”(Gitdirectory)。
这时”Git目录”中虽然有一些文件,但是没有任何提交(commit)在里面,所以我们叫它是空仓库(emptyGitrepository)。
和SVN不同,一个Git项目一般只在项目的根目录下建一个“.git”目录,而SVN则会在项目的每一个目录下建一个”.svn”目录;这也我喜欢Git的原因之一:
)
Git把所有的历史提交信息全部存储在“Git目录”里,它就是一个Git项目的仓库;你对本地的源代码进行编辑修改后创建的提交也都会先保存在这里面,然后再推送到远端的服务器。
当我们我把项目目录和“Git目录”一起拷到其它电脑里,它能马上正常的工作(所有的提交信息全都保存在Git目录里);甚至可以只把“Git目录”拷走也行,但是要再签出(checkout)一次。
Git为了调试的方便,它可以指定项目的Git目录的位置。
有两种办法:
一是设置“GIT_DIR”环境变量,二是在命令行里设定“--git-dir--git-dir”参数指定它的位置,大家可以看一下这里(git
(1)ManualPage)。
庖丁解牛
前面的这些东东我在第一篇里也大概的讲过一些,但是今天我们想不但要开动这辆叫“Git”的跑车,还想看看它里面有些什么样的零件,是怎么构成的。
OK,我们来看看“test_proj”项目里的“Git目录”的结构:
$cdtest_proj/.git
$ls|more
branches/#新版的Git已经不再使用这个目录,所以大家看到它#一般会是空的
COMMIT_EDITMSG#保存着上一次提交时的注释信息
config#项目的配置信息
description#项目的描述信息
HEAD#项目当前在哪个分支的信息
hooks/#默认的“hooks”脚本文件
index#索引文件,gitadd后把要添加的项暂存到这里
info/#里面有一个exclude文件,指定本项目要忽略的文件#,看一下这里
logs/#各个refs的历史信息
objects/#这个目录非常重要,里面存储都是Git的数据对象
#包括:
提交(commits),树对象(trees),二进制对象#(blobs),标签对象(tags)。
#不明白没有关系,后面会讲的。
refs/#标识着你的每个分支指向哪个提交(commit)。
我先用gitlog命令来看一下这个Git项目里有哪些提交:
$gitlog
commit58b53