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,以及須要注意的問題:)

相關文章
相關標籤/搜索