Git历险记(一)

来源:互联网 发布:鸟哥的linux私房菜豆瓣 编辑:程序博客网 时间:2024/04/28 15:37

FROM:http://blog.csdn.net/mr_raptor/article/details/7391912

Source : http://www.infoq.com/cn/news/2011/01/git-adventures-1

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

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

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

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

在这里假设各位同学的电脑都装好了Git,如果没有装好,可以先看一下这里(安装Git)。当然,后面的章节我会专门讲安装可能会碰到的问题。

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

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

我们先用建一个仓库吧:

[plain] view plain copy
  1. $mkdir testGit #建立仓库目录  
  2. $cd testGit #进入仓库目录  
  3. $git init #这会在当前的目录下建一个仓库  
  4. Initialized empty Git repository in e:/doc/Git/test/testGit/.git/   

好的,前面的三行命令就建立了一个本地的Git仓库。这个仓库现在是一个空的仓库。

我们在命令行下执行:

[plain] view plain copy
  1. $ git status #查看当前仓库的状态  
  2. # On branch master (在master分支上)   
  3. #   
  4. # Initial commit   
  5. #   
  6. nothing to commit (create/copy files and use "git add" to track)   
  7. (现在没有任何台被提交的文件,复制或创建新的文件,再用”git add” 命令添加到暂存区中)   
  8. $ git log #查看当前仓库的历史日志  
  9. fatal: bad default revision 'HEAD'  
  10. (由于仓库里没有任提交在里面,所以它会报这个错。BTW: 这种提示是不是有点不友好呀:) )   

现在就让我们在这个仓库里添加点内容吧。

[plain] view plain copy
  1. $ echo “hello Git” > readme.txt #建立一个含有 hello Git 的文本文件  
  2. $ git add readme.txt #将readme.txt添加到暂存区中  
  3. $ git status #查看当前仓库的状态   
  4. # On branch master   
  5. #   
  6. # Initial commit   
  7. #   
  8. # Changes to be committed:(暂存里下次将被提交的修改)   
  9. # (use "git rm --cached <file>..." to unstage)   
  10. #   
  11. # new file: readme.txt   
  12. #   

好的,文件即然被暂存到暂存区中,我们现在就可以把它提交到仓库里面去:)

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

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

[plain] view plain copy
  1. $ git log   
  2. commit 8223db3b064a9826375041c8fea020cb2e3b17d1   
  3. Author: liuhui998 <liuhui998@gmail.com>   
  4. Date: Sat Jan 1 18:12:38 2011 +0800   
  5. project init   

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

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

[plain] view plain copy
  1. $ echo "Git is Cool" >> readme.txt #在文件的最后添加一行   
  2. $ git status #查看当前仓库的状态   
  3. # On branch master   
  4. # Changed but not updated: (修改了,但是还没有暂存的内容)   
  5. # (use "git add <file>..." to update what will be committed)   
  6. # (use "git checkout -- <file>..." to discard changes in working directory)   
  7. #   
  8. # modified: readme.txt   
  9. #   
  10. no changes added to commit (use "git add" and/or "git commit -a")   
  11.   
  12. (没有修改可以被提交,使用 “git add” 命令添加文件到暂存区,或是使用“git commit -a” 命令强制提交当前目录下的所有文件)  

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

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

[plain] view plain copy
  1. $ git diff #查看仓库里未暂存内容和仓库已提交内容的差异   
  2. diff --git a/readme.txt b/readme.txt   
  3. index 7b5bbd9..49ec0d6 100644   
  4. --- a/readme.txt   
  5. +++ b/readme.txt   
  6. @@ -1 +1,2 @@   
  7. hello Git   
  8. +Git is Cool   

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

好的,我们现在再把 readme.txt放到暂存区里:

[plain] view plain copy
  1. $ git add readme.txt   

我们现在看一下仓库的状态:

[plain] view plain copy
  1. $ git status   
  2. # On branch master   
  3. # Changes to be committed:   
  4. # (use "git reset HEAD <file>..." to unstage)   
  5. #   
  6. # modified: readme.txt   
  7. #   

可以提交了:

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

再看一下新的日志:

[plain] view plain copy
  1. $ git log   
  2. commit 45ff89198f08365bff32364034aed98126009e44   
  3. Author: liuhui998 <liuhui998@gmail.com>   
  4. Date: Sat Jan 1 18:17:07 2011 +0800   
  5. Git is Cool   
  6. commit 8223db3b064a9826375041c8fea020cb2e3b17d1   
  7. Author: liuhui998 <liuhui998@gmail.com>   
  8. Date: Sat Jan 1 18:12:38 2011 +0800   
  9. project init   

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

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

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

0 0