Git 历险记
Git歷險記(一)
作為分布式版本控制系統(tǒng)的重要代表——Git已經(jīng)為越來越多的人所認(rèn)識,它相對于我們熟悉的CVS、SVN甚至同時分布式控制系統(tǒng)的Mercurial,有哪些優(yōu)勢和不足呢。這次InfoQ中文站有幸邀請到《Git Community Book》的譯者劉輝,在InfoQ開辟《Git歷險記》專欄,分享他使用Git的經(jīng)驗(yàn),以及他對Git的看法。
Git是Linus.Torvald為了管理Linux內(nèi)核發(fā)起并開發(fā)的一個開源分布式版本控件系統(tǒng)(DVCS)。從2002年起,Linux 內(nèi)核一直使用BitKeeper來進(jìn)行版本管理,但是在2005年BitKeeper和Linux 內(nèi)核開源社區(qū)的合作關(guān)系結(jié)束,BitKeeper再也不能免費(fèi)使用了,這迫使Linus決定開發(fā)一個開源界自已的版本控制系統(tǒng)。
傳統(tǒng)的SVN、CVS 等版本控制系統(tǒng),只有一個倉庫(repository),用戶必須要連上這個倉庫才能開始提交;而Git之類的分布式版本控制系統(tǒng)(當(dāng)然也還包括 BitKeeper、Mercurial等等),它的每個工作目錄都包含一個完整的倉庫,它們可以支持離線工作,先把工作提交到本地倉庫后再提交上遠(yuǎn)程的服務(wù)器上的倉庫里。分布式的處理也讓開發(fā)更為便捷,開發(fā)人員可以很方便的在本地創(chuàng)建分支來進(jìn)行日常開發(fā),每個人的本地倉庫都是平等且獨(dú)立,不會因?yàn)槟愕谋镜靥峤欢苯佑绊憚e人。
老實(shí)說,Git的速度是我用的版本控制系統(tǒng)中最快的(SVN Mercurial Git)。我這里說的速度,包括本地提交(commit)、本地簽出(checkout)、提交到遠(yuǎn)程倉庫(git push)和從遠(yuǎn)程倉庫獲取(git fetch ,git pull);它的本地操作速度和本地文件系統(tǒng)在一個級別,遠(yuǎn)程倉庫的操作速度和SFTP文件傳輸在一個級別。這當(dāng)然和Git的內(nèi)部實(shí)現(xiàn)機(jī)制有關(guān),這里就不多展開了,有興趣的朋友可以看一下這里:Git is the next Unix。
我們在學(xué)一門新的語言時,往往是從一個“hello world” 程序開始的,那么Git歷程也就從一個“hello Git”開始吧。
在這里假設(shè)各位同學(xué)的電腦都裝好了Git,如果沒有裝好,可以先看一下這里(安裝Git)。當(dāng)然,后面的章節(jié)我會專門講安裝可能會碰到的問題。
我們首先打開Git的命令行:windows下是點(diǎn)擊“Git Bash 快捷方式”;Linux或是Unix like平臺的話就直接打開命令行界面就可以了。
備注:$符號后面的字符串代表的是命令行輸入;命令行輸入后的以#開始的黑體字符串代表注釋;其它的部分則是命令行輸出。
我們先用建一個倉庫吧:
$mkdir testGit #建立倉庫目錄 $cd testGit #進(jìn)入倉庫目錄 $git init #這會在當(dāng)前的目錄下建一個倉庫 Initialized empty Git repository in e:/doc/Git/test/testGit/.git/好的,前面的三行命令就建立了一個本地的Git倉庫。這個倉庫現(xiàn)在是一個空的倉庫。
我們在命令行下執(zhí)行:
$ git status #查看當(dāng)前倉庫的狀態(tài) # On branch master (在master分支上) # # Initial commit # nothing to commit (create/copy files and use "git add" to track) (現(xiàn)在沒有任何臺被提交的文件,復(fù)制或創(chuàng)建新的文件,再用”git add” 命令添加到暫存區(qū)中) $ git log #查看當(dāng)前倉庫的歷史日志 fatal: bad default revision 'HEAD' (由于倉庫里沒有任提交在里面,所以它會報這個錯。BTW: 這種提示是不是有點(diǎn)不友好呀:) )現(xiàn)在就讓我們在這個倉庫里添加點(diǎn)內(nèi)容吧。
$ echo “hello Git” > readme.txt #建立一個含有 hello Git 的文本文件 $ git add readme.txt #將readme.txt添加到暫存區(qū)中 $ git status #查看當(dāng)前倉庫的狀態(tài) # On branch master # # Initial commit # # Changes to be committed:(暫存里下次將被提交的修改) # (use "git rm --cached <file>..." to unstage) # # new file: readme.txt #好的,文件即然被暫存到暫存區(qū)中,我們現(xiàn)在就可以把它提交到倉庫里面去:)
$ 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) (現(xiàn)在這個工作目錄里沒有什么要提交的東東,它是整潔的)現(xiàn)在你執(zhí)行一下git log 命令就會看到剛才的提交記錄
$ git log commit 8223db3b064a9826375041c8fea020cb2e3b17d1 Author: liuhui998 <liuhui998@gmail.com> Date: Sat Jan 1 18:12:38 2011 +0800 project init“8223db3b064a9826375041c8fea020cb2e3b17d1”這一串字符就是我們這次創(chuàng)建的提交的名字??雌饋硎遣皇呛苁?#xff0c;如果經(jīng)常用電驢的朋友就會發(fā)現(xiàn)它就是和電驢里內(nèi)容標(biāo)識符一樣,都是SHA1串。Git通過對提交內(nèi)容進(jìn)行 SHA1 Hash運(yùn)算,得到它們的SHA1串值,作為每個提交的唯一標(biāo)識。根據(jù)一般的密碼學(xué)原理來說,如果兩個提交的內(nèi)容不相同,那么它們的名字就不會相同;反之,如果它們的名字相同,就意味著它們的內(nèi)容也相同。
現(xiàn)在我想改一下倉庫里文件的內(nèi)容,現(xiàn)提交到倉庫中去
$ echo "Git is Cool" >> readme.txt #在文件的最后添加一行 $ git status #查看當(dāng)前倉庫的狀態(tài) # On branch master # Changed but not updated: (修改了,但是還沒有暫存的內(nèi)容) # (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” 命令添加文件到暫存區(qū),或是使用“git commit -a” 命令強(qiáng)制提交當(dāng)前目錄下的所有文件)
OK,即然我們修改了倉庫里被提交的文件,那么我想看一下我們
到底改了哪些地方,再決定是否提交。
$ git diff #查看倉庫里未暫存內(nèi)容和倉庫已提交內(nèi)容的差異 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”。
好的,我們現(xiàn)在再把 readme.txt放到暫存區(qū)里:
$ git add readme.txt我們現(xiàn)在看一下倉庫的狀態(tài):
$ 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” 這個就是我們剛才提交修改時創(chuàng)建的提交。
大家這么一路看過來,是不是有點(diǎn)糊涂了。不過沒有關(guān)系,如果你的電腦裝了Git,那么你把上面的這些命令全部執(zhí)行一下遍就會對它有感性的認(rèn)識了。
下面的的章節(jié),我會講一下如何在windows和Linux安裝配置Git,以及需要注意的問題:)
參考
GitCommunityBook?中文版
ProGit?中文版
Git is the next Unix
Git歷險記(二)——Git的安裝和配置
上回Git歷險記(一)講了一個 “hello Git” 的小故事。有的同學(xué)可能是玩過了其它分布式版本控制系統(tǒng)(DVCS),看完之后就觸類旁通對Git就了然于胸了;也有的同學(xué)可能還如我當(dāng)初入手Git一樣,對它還是摸不著頭腦。
從這一篇開始,我就將比較“啰嗦”的和大家一起從零開始經(jīng)歷Git使用的每一步,當(dāng)然對我而言這也是一個重新認(rèn)識Git的過程。
使用Git的第一步肯定是安裝Git,因?yàn)樵诙鄶?shù)平臺上Git是沒有預(yù)裝的。我平時主要的工作環(huán)境是windows和Linux(ubuntu),我想看這篇文章的同學(xué)多半也是在這兩個平臺下工作;下面我講一下如何在這兩個平臺下安裝和配置Git。
BTW:如果是蘋果平臺的用戶的安裝可以參看一下這里(1,2),配置和命令行的使用與windows、Linux(*nix)平臺差別不大。
Linux (*nix) 平臺
Linus開發(fā)Git的最初目的就是為了開發(fā)Linux內(nèi)核服務(wù)的,自然它對Linux的平臺支持也是最棒的。在Linux下安裝Git大約有幾種方法:
從源代碼開始(這種方法也適合于多數(shù)*nix平臺)
從Git官網(wǎng)的下載頁面下載它最新穩(wěn)定版的源代碼,就可以從源代碼開始編譯、安裝:
$ wget http://kernel.org/pub/software/scm/git/git-1.7.3.5.tar.bz2 $ tar -xjvf git-1.7.3.5.tar.bz2 $ cd git-1.7.3.5 $ make prefix=/usr all ;# prefix設(shè)置你的Git安裝目錄 $ sudo make prefix=/usr install ;# 以root權(quán)限運(yùn)行為了編譯Git的源代碼,我們還需要一些庫:?expat、curl、?zlib?和?openssl; 除了expat 外,其它的庫可能在你的機(jī)器上都安裝了。
使用安裝包管理器(apt 或 yum)
在 fedora 等系統(tǒng)下用yum?:
$ yum install git-core在debian, ubuntu等系統(tǒng)下用apt?:
$ apt-get install git-core有時候,你系統(tǒng)里的安裝包管理器出現(xiàn)了問題,或是要安裝Git的機(jī)器不能上網(wǎng)、沒有編譯器的話,你可以從下面的站點(diǎn)去下載 “.deb” 或 “.rpm”的安裝包:
- RPM Packages
- Stable Debs
Windows平臺
windows平臺有兩個模擬*nix like運(yùn)行環(huán)境的工具:cygwin,msys;Git在cygwin,msys下都有相應(yīng)的移植版本。我個人覺得msys平臺下的msysGit最好用,現(xiàn)在我在windows下也是用的這個版本。
很多同學(xué)可能要問,現(xiàn)在windows下有那多Git用戶,為什么Git不直接出一個windows native版。俺當(dāng)年翻看了一下Git的源代碼,它里面使用了大量的*nix平臺的native api,而這些api在windows下是沒有的,所以必須要用cygwin、msys這樣的一個中間層來滿足軟件移植的要求。
下面我“啰嗦”一下如何在windows下安裝msysGit。
下載
到它的下載頁面去下載一個最新的完整安裝包,筆者在撰寫本文時下載的是這個。
安裝
安裝的過程沒有什么好說的,一般是開始安裝后,一路的點(diǎn)擊“下一步”。由于windows平臺的換行符(CRLF)和Linux(*nix)平臺的換行符(LF)不同,那么在windows下開發(fā)其它平臺軟件的朋友有一個地方要注意(見下圖):
在這里一最好選“Checkout as-is, commit as-is”這個選項(xiàng),這樣,Git就不會修改你代碼的換行符風(fēng)格。
以前有個朋友因?yàn)檫x錯了這個選項(xiàng),以致他在windows平臺下的一簽出(checkout)其它平臺的代碼,就會顯示”已修改“(modified),不過后來可能msysGit也認(rèn)識到這個問題了,就把默認(rèn)選項(xiàng)改成了這個選項(xiàng)。
BTW: 其實(shí)前面兩項(xiàng)也是有用的,如果對windows和Linux(*nix)平臺如何處理換行符很熟悉的話,也可以嘗試一下前面兩個選項(xiàng):)
配置Git
在Linux下和windows下配置Git的方法差不多,只是在Linux下,可以在命令行里直接使用git config進(jìn)行配置, 而在windows下則要先打開“Git Bash”,進(jìn)入msysGit命令行界面,再用git config命令進(jìn)行相應(yīng)的配置操作。
好了,前面安裝好了Git,現(xiàn)在我們開始配置:
第一個需要配置的就是用戶的用戶名和email,因?yàn)檫@些內(nèi)容會出現(xiàn)在你的每一個提交(commit)里面的,像下面這樣:
$ git log #我們用git log查看當(dāng)前倉庫的提交(commit)日志 commit 71948005382ff8e02dd8d5e8d2b4834428eece24 Author: author <author@corpmail.com> Date: Thu Jan 20 12:58:05 2011 +0800 Project init下面的這兩行命令就是設(shè)置用戶名和email:
$ git config --global user.name author #將用戶名設(shè)為author $ git config --global user.email author@corpmail.com #將用戶郵箱設(shè)為author@corpmail.comGit的配置信息分為全局和項(xiàng)目兩種,上面命令中帶了“--global"參數(shù),這就意味是在進(jìn)行全局配置,它會影響本機(jī)上的每個一個Git項(xiàng)目。
大家看到,上面我們用的是@corpmail(公司郵箱);但是有時候我們可能也參與了一些開源項(xiàng)目,那么就需要新的用戶名和自己的私人郵箱,Git 可以為每個項(xiàng)目設(shè)定不同的配置信息。
在命令行環(huán)境,進(jìn)入Git項(xiàng)目所在目錄,執(zhí)行下面的命令:
$ git config user.name nickname#將用戶名設(shè)為nickname $ git config user.email nickname@gmail.com #將用戶郵箱設(shè)為nickname@gmail.comGit的設(shè)計哲學(xué)和Linux(*nix)一樣,盡量的使用“文本化”(Textuality);它里面盡量用文本化的形式存儲信息,對于配置信息也更是如此,用戶的這些配置信息全部是存儲在文本文件中。Git的全局配置文件是存放在"~/.gitconfig"(用戶目錄下的.gitconfig)文件中:
我們用cat、head命令查看全局配置信息文件,并假設(shè)相關(guān)配置信息存儲在文件的前3行(當(dāng)然也有可能不在前3行,這里只是為了方便表示)
$ cat ~/.gitconfig | head -3 [user] name = author email = author@corpmail.com而項(xiàng)目配置文件是存放在Git項(xiàng)目所在目錄的".git/config"文件中,這里也像上面一樣用cat、head命令查看一下:
$ cat .git/config | head -3 [user] name = nickname email = nickname@gmail.com如果大家對于Git熟悉后,可以直修改”~/.gitconfig”,”.git/config”這兩個文件進(jìn)行配置。
Git里還有很多可以配置的地方,大家可以參考一下git config?和?定制git。
這一篇寫起來有點(diǎn)平淡無奇,但這是一個Git用戶邁出的第一步。后面我還會有一系列的文章出來,都是我個人使用過程中的感悟。
有朋友問我:“為什么把文章叫作:‘Git歷險記’”。這是因?yàn)樵谑褂肎it的歷程中,我碰到過N多的問題;同時也覺得它有點(diǎn)小復(fù)雜。但是當(dāng)這些問題解開后,就有時不得不贊嘆它設(shè)計的巧妙之處。
如果大家對于我的文章有什么問題和建議,歡迎給我寫郵件:
之前我建立了一個?git中文用戶組?,如果大家在使用Git的過程中碰到什么麻煩事,歡迎你在這個用戶組里提問。
參考資料:
- GitCommunityBook?中文版
- ProGit?中文版
- git config
轉(zhuǎn)載于:https://www.cnblogs.com/tham/p/6827309.html
總結(jié)
- 上一篇: Intent.createChooser
- 下一篇: js 中null,undefined区别