Git历险记(一)

【编者按】做为分布式版本控制系统的重要表明——Git已经为愈来愈多的人所认识,它相对于咱们熟悉的CVS、SVN甚至同时分布式控制系统的 Mercurial,有哪些优点和不足呢。此次InfoQ中文站有幸邀请到《Git Community Book》的译者刘辉,在InfoQ开辟《Git历险记》专栏,分享他使用Git的经验,以及他对Git的见解。html


Git是Linus.Torvald为了管理Linux内核发起并开发的一个开源分布式版本控件系统(DVCS)。从2002年起,Linux 内核一直使用BitKeeper来进行版本管理,可是在2005年BitKeeper和Linux 内核开源社区的合做关系结束,BitKeeper不再能无偿使用了,这迫使Linus决定开发一个开源界自已的版本控制系统。linux

传统的SVN、CVS 等版本控制系统,只有一个仓库(repository),用户必需要连上这个仓库才能开始提交;而Git之类的分布式版本控制系统(固然也还包括 BitKeeper、Mercurial等 等),它的每一个工做目录都包含一个完整的仓库,它们能够支持离线工做,先把工做提交到本地仓库后再提交上远程的服务器上的仓库里。分布式的处理也让开发更 为便捷,开发人员能够很方便的在本地建立分支来进行平常开发,每一个人的本地仓库都是平等且独立,不会由于你的本地提交而直接影响别人。git

老实说,Git的速度是我用的版本控制系统中最快的(SVN Mercurial Git)。我这里说的速度,包括本地提交(commit)、本地签出(checkout)、提交到远程仓库(git push)和从远程仓库获取(git fetch ,git pull);它的本地操做速度和本地文件系统在一个级别,远程仓库的操做速度和SFTP文件传输在一个级别。这固然和Git的内部实现机制有关,这里就不 多展开了,有兴趣的朋友能够看一下这里:Git is the next Unixwindows

咱们在学一门新的语言时,每每是从一个“hello world” 程序开始的,那么Git历程也就从一个“hello Git”开始吧。服务器

在这里假设各位同窗的电脑都装好了Git,若是没有装好,能够先看一下这里(安装Git)。固然,后面的章节我会专门讲安装可能会碰到的问题。分布式

咱们首先打开Git的命令行:windows下是点击“Git Bash 快捷方式”;Linux或是Unix like平台的话就直接打开命令行界面就能够了。fetch

备注:$符号后面的字符串表明的是命令行输入;命令行输入后的以#开始的黑体字符串表明注释;其它的部分则是命令行输出。ui

咱们先用建一个仓库吧:google

$mkdir testGit #创建仓库目录
$cd testGit #进入仓库目录
$git init #这会在当前的目录下建一个仓库
Initialized empty Git repository in e:/doc/Git/test/testGit/.git/ 

好的,前面的三行命令就创建了一个本地的Git仓库。这个仓库如今是一个空的仓库。url

咱们在命令行下执行:

$ git status #查看当前仓库的状态
# On branch master (在master分支上) 
# 
# Initial commit 
# 
nothing to commit (create/copy files and use "git add" to track) 
(如今没有任何台被提交的文件,复制或建立新的文件,再用”git add” 命令添加到暂存区中) 
$ git log #查看当前仓库的历史日志
fatal: bad default revision 'HEAD'
(因为仓库里没有任提交在里面,因此它会报这个错。BTW: 这种提示是否是有点不友好呀:) ) 

如今就让咱们在这个仓库里添加点内容吧。

$ echo “hello Git” > readme.txt #创建一个含有 hello Git 的文本文件
$ git add readme.txt #将readme.txt添加到暂存区
$ git status #查看当前仓库的状态 
# On branch master 
# 
# Initial commit 
# 
# Changes to be committed:(暂存里下次将被提交的修改) 
# (use "git rm --cached <file>..." to unstage) 
# 
# new file: readme.txt 
# 

好的,文件即然被暂存到暂存区中,咱们如今就能够把它提交到仓库里面去:)

$ git commit -m "project init" #将刚才的修改提交到本地仓库中 
[master (root-commit) 8223db3] project init 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 readme.txt 
$ git status 
# On branch master 
nothing to commit (working directory clean) 
(如今这个工做目录里没有什么要提交的东东,它是整洁的) 

如今你执行一下git log 命令就会看到刚才的提交记录

$ git log 
commit 8223db3b064a9826375041c8fea020cb2e3b17d1 
Author: liuhui998 <liuhui998@gmail.com> 
Date: Sat Jan 1 18:12:38 2011 +0800 
project init 

“8223db3b064a9826375041c8fea020cb2e3b17d1”这一串字符就是咱们此次建立的提交的名字。看起来是否是很 熟,若是常常用电驴的朋友就会发现它就是和电驴里内容标识符同样,都是SHA1串。Git经过对提交内容进行 SHA1 Hash运算,获得它们的SHA1串值,做为每一个提交的惟一标识。根据通常的密码学原理来讲,若是两个提交的内容不相同,那么它们的名字就不会相同;反 之,若是它们的名字相同,就意味着它们的内容也相同。

如今我想改一下仓库里文件的内容,现提交到仓库中去

$ echo "Git is Cool" >> readme.txt #在文件的最后添加一行 
$ git status #查看当前仓库的状态 
# On branch master 
# Changed but not updated: (修改了,可是尚未暂存的内容) 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: readme.txt 
# 
no changes added to commit (use "git add" and/or "git commit -a")

(没有修改能够被提交,使用 “git add” 命令添加文件到暂存区,或是使用“git commit -a” 命令强制提交当前目录下的全部文件)

OK,即然咱们修改了仓库里被提交的文件,那么我想看一下咱们

到底改了哪些地方,再决定是否提交。

$ git diff #查看仓库里未暂存内容和仓库已提交内容的差别 
diff --git a/readme.txt b/readme.txt 
index 7b5bbd9..49ec0d6 100644 
--- a/readme.txt 
+++ b/readme.txt 
@@ -1 +1,2 @@ 
hello Git 
+Git is Cool 

很好,正如咱们所愿,咱们只是在readme.txt的最后一行添加了一行“Git is Cool”。

好的,咱们如今再把 readme.txt放到暂存区里:

$ git add readme.txt 

咱们如今看一下仓库的状态:

$ git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: readme.txt 
# 

能够提交了:

$ git commit -m "Git is Cool" 
[master 45ff891] Git is Cool 
1 files changed, 1 insertions(+), 0 deletions(-) 
(一个文件被修改,一行插入,零行删除) 

再看一下新的日志:

$ git log 
commit 45ff89198f08365bff32364034aed98126009e44 
Author: liuhui998 <liuhui998@gmail.com> 
Date: Sat Jan 1 18:17:07 2011 +0800 
Git is Cool 
commit 8223db3b064a9826375041c8fea020cb2e3b17d1 
Author: liuhui998 <liuhui998@gmail.com> 
Date: Sat Jan 1 18:12:38 2011 +0800 
project init 

“45ff89198f08365bff32364034aed98126009e44” 这个就是咱们刚才提交修改时建立的提交。

你们这么一路看过来,是否是有点糊涂了。不过没有关系,若是你的电脑装了Git,那么你把上面的这些命令所有执行一下遍就会对它有感性的认识了。

下面的的章节,我会讲一下如何在windows和Linux安装配置Git,以及须要注意的问题:)

相关文章
相关标签/搜索