Git 教程(一):簡介和安裝

爲何要編寫這個教程?由於我在學習Git的過程當中,買過書,也在網上Google了一堆Git相關的文章和教程,但使人失望的是,這些教程不是可貴使人髮指,就是簡單得一筆帶過,或者,只支離破碎地介紹Git的某幾個命令,還有直接從Git手冊粘貼幫助文檔的,總之,初學者很難找到一個由淺入深,學完後能馬上上手的Git教程。python

既然號稱史上最淺顯易懂的Git教程,那這個教程有什麼讓你怦然心動的特色呢?git

首先,本教程絕對面向初學者,沒有接觸過版本控制概念的讀者也能夠輕鬆入門,沒必要擔憂起步難度;github

其次,本教程實用性超強,邊學邊練,一點也不以爲枯燥。並且,你所學的Git命令是「充分且必要」的,掌握了這些東西,你就能夠經過Git輕鬆地完成你的工做。sql

本教程只會讓你成爲Git用戶,不會讓你成爲Git專家。不少Git命令只有那些專家才明白(事實上我也不明白,由於我不是Git專家),但我保證這些命令可能你一生都不會用到。既然Git是一個工具,就不必把時間浪費在那些「高級」但幾乎永遠不會用到的命令上。一旦你真的非用不可了,到時候再自行Google或者請教專家也未遲。windows

若是你是一個開發人員,想用上這個世界上目前最早進的分佈式版本控制系統,那麼,趕快開始學習吧!xcode

Git簡介

Git是什麼?安全

Git是目前世界上最早進的分佈式版本控制系統(沒有之一)。ruby

Git有什麼特色?簡單來講就是:高端大氣上檔次!服務器

那什麼是版本控制系統?分佈式

若是你用Microsoft Word寫過長篇大論,那你必定有這樣的經歷:

想刪除一個段落,又怕未來想恢復找不回來怎麼辦?有辦法,先把當前文件「另存爲……」一個新的Word文件,再接着改,改到必定程度,再「另存爲……」一個新文件,這樣一直改下去,最後你的Word文檔變成了這樣:

lots-of-docs

過了一週,你想找回被刪除的文字,可是已經記不清刪除前保存在哪一個文件裏了,只好一個一個文件去找,真麻煩。

看着一堆亂七八糟的文件,想保留最新的一個,而後把其餘的刪掉,又怕哪天會用上,還不敢刪,真鬱悶。

更要命的是,有些部分須要你的財務同事幫助填寫,因而你把文件Copy到U盤裏給她(也可能經過Email發送一份給她),而後,你繼續修改Word文件。一天後,同事再把Word文件傳給你,此時,你必須想一想,發給她以後到你收到她的文件期間,你做了哪些改動,得把你的改動和她的部分合並,真困難。

因而你想,若是有一個軟件,不但能自動幫我記錄每次文件的改動,還可讓同事協做編輯,這樣就不用本身管理一堆相似的文件了,也不須要把文件傳來傳去。若是想查看某次改動,只須要在軟件裏瞄一眼就能夠,豈不是很方便?

這個軟件用起來就應該像這個樣子,能記錄每次文件的改動:

版本 用戶 說明 日期
1 張三 刪除了軟件服務條款5 7/12 10:38
2 張三 增長了License人數限制 7/12 18:09
3 李四 財務部門調整了合同金額 7/13 9:51
4 張三 延長了免費升級週期 7/14 15:17

這樣,你就結束了手動管理多個「版本」的史前時代,進入到版本控制的20世紀。

Git的誕生

不少人都知道,Linus在1991年建立了開源的Linux,今後,Linux系統不斷髮展,已經成爲最大的服務器系統軟件了。

Linus雖然建立了Linux,但Linux的壯大是靠全世界熱心的志願者參與的,這麼多人在世界各地爲Linux編寫代碼,那Linux的代碼是如何管理的呢?

事實是,在2002年之前,世界各地的志願者把源代碼文件經過diff的方式發給Linus,而後由Linus本人經過手工方式合併代碼!

你也許會想,爲何Linus不把Linux代碼放到版本控制系統裏呢?不是有CVS、SVN這些免費的版本控制系統嗎?由於Linus堅決地反對CVS和SVN,這些集中式的版本控制系統不但速度慢,並且必須聯網才能使用。有一些商用的版本控制系統,雖然比CVS、SVN好用,但那是付費的,和Linux的開源精神不符。

不過,到了2002年,Linux系統已經發展了十年了,代碼庫之大讓Linus很難繼續經過手工方式管理了,社區的弟兄們也對這種方式表達了強烈不滿,因而Linus選擇了一個商業的版本控制系統BitKeeper,BitKeeper的東家BitMover公司出於人道主義精神,受權Linux社區無償使用這個版本控制系統。

安定團結的大好局面在2005年就被打破了,緣由是Linux社區牛人彙集,難免沾染了一些梁山好漢的江湖習氣。開發Samba的Andrew試圖破解BitKeeper的協議(這麼幹的其實也不僅他一個),被BitMover公司發現了(監控工做作得不錯!),因而BitMover公司怒了,要收回Linux社區的無償使用權。

Linus能夠向BitMover公司道個歉,保證之後嚴格管教弟兄們,嗯,這是不可能的。實際狀況是這樣的:

Linus花了兩週時間本身用C寫了一個分佈式版本控制系統,這就是Git!一個月以內,Linux系統的源碼已經由Git管理了!牛是怎麼定義的呢?你們能夠體會一下。

Git迅速成爲最流行的分佈式版本控制系統,尤爲是2008年,GitHub網站上線了,它爲開源項目免費提供Git存儲,無數開源項目開始遷移至GitHub,包括jQuery,PHP,Ruby等等。

歷史就是這麼偶然,若是不是當年BitMover公司威脅Linux社區,可能如今咱們就沒有免費而超級好用的Git了。

集中式vs分佈式

Linus一直痛恨的CVS及SVN都是集中式的版本控制系統,而Git是分佈式版本控制系統,集中式和分佈式版本控制系統有什麼區別呢?

先說集中式版本控制系統,版本庫是集中存放在中央服務器的,而幹活的時候,用的都是本身的電腦,因此要先從中央服務器取得最新的版本,而後開始幹活,幹完活了,再把本身的活推送給中央服務器。中央服務器就比如是一個圖書館,你要改一本書,必須先從圖書館借出來,而後回到家本身改,改完了,再放回圖書館。

central-repo

集中式版本控制系統最大的毛病就是必須聯網才能工做,若是在局域網內還好,帶寬夠大,速度夠快,可若是在互聯網上,遇到網速慢的話,可能提交一個10M的文件就須要5分鐘,這還不得把人給憋死啊。

那分佈式版本控制系統與集中式版本控制系統有何不一樣呢?首先,分佈式版本控制系統根本沒有「中央服務器」,每一個人的電腦上都是一個完整的版本庫,這樣,你工做的時候,就不須要聯網了,由於版本庫就在你本身的電腦上。既然每一個人電腦上都有一個完整的版本庫,那多我的如何協做呢?比方說你在本身電腦上改了文件A,你的同事也在他的電腦上改了文件A,這時,大家倆之間只需把各自的修改推送給對方,就能夠互相看到對方的修改了。

和集中式版本控制系統相比,分佈式版本控制系統的安全性要高不少,由於每一個人電腦裏都有完整的版本庫,某一我的的電腦壞掉了沒關係,隨便從其餘人那裏複製一個就能夠了。而集中式版本控制系統的中央服務器要是出了問題,全部人都無法幹活了。

在實際使用分佈式版本控制系統的時候,其實不多在兩人之間的電腦上推送版本庫的修改,由於可能大家倆不在一個局域網內,兩臺電腦互相訪問不了,也可能今天你的同事病了,他的電腦壓根沒有開機。所以,分佈式版本控制系統一般也有一臺充當「中央服務器」的電腦,但這個服務器的做用僅僅是用來方便「交換」你們的修改,沒有它你們也同樣幹活,只是交換修改不方便而已。

distributed-repo

固然,Git的優點不單是沒必要聯網這麼簡單,後面咱們還會看到Git極其強大的分支管理,把SVN等遠遠拋在了後面。

CVS做爲最先的開源並且免費的集中式版本控制系統,直到如今還有很多人在用。因爲CVS自身設計的問題,會形成提交文件不完整,版本庫莫名其妙損壞的狀況。一樣是開源並且免費的SVN修正了CVS的一些穩定性問題,是目前用得最多的集中式版本庫控制系統。

除了免費的外,還有收費的集中式版本控制系統,好比IBM的ClearCase(之前是Rational公司的,被IBM收購了),特色是安裝比Windows還大,運行比蝸牛還慢,能用ClearCase的通常是世界500強,他們有個共同的特色是財大氣粗,或者人傻錢多。

微軟本身也有一個集中式版本控制系統叫VSS,集成在Visual Studio中。因爲其反人類的設計,連微軟本身都很差意思用了。

分佈式版本控制系統除了Git以及促使Git誕生的BitKeeper外,還有相似Git的Mercurial和Bazaar等。這些分佈式版本控制系統各有特色,但最快、最簡單也最流行的依然是Git!

 

安裝Git

最先Git是在Linux上開發的,很長一段時間內,Git也只能在Linux和Unix系統上跑。不過,慢慢地有人把它移植到了Windows上。如今,Git能夠在Linux、Unix、Mac和Windows這幾大平臺上正常運行了。

要使用Git,第一步固然是安裝Git了。根據你當前使用的平臺來閱讀下面的文字:

在Linux上安裝Git

首先,你能夠試着輸入git,看看系統有沒有安裝Git:

$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git 

像上面的命令,有不少Linux會友好地告訴你Git沒有安裝,還會告訴你如何安裝Git。

若是你碰巧用Debian或Ubuntu Linux,經過一條sudo apt-get install git就能夠直接完成Git的安裝,很是簡單。

 

老一點的Debian或Ubuntu Linux,要把命令改成sudo apt-get install git-core,由於之前有個軟件也叫GIT(GNU Interactive Tools),結果Git就只能叫git-core了。因爲Git名氣實在太大,後來就把GNU Interactive Tools改爲gnuitgit-core正式改成git

若是是其餘Linux版本,能夠直接經過源碼安裝。先從Git官網下載源碼,而後解壓,依次輸入:./configmakesudo make install這幾個命令安裝就行了。

在Mac OS X上安裝Git

若是你正在使用Mac作開發,有兩種安裝Git的方法。

一是安裝homebrew,而後經過homebrew安裝Git,具體方法請參考homebrew的文檔:http://brew.sh/

第二種方法更簡單,也是推薦的方法,就是直接從AppStore安裝Xcode,Xcode集成了Git,不過默認沒有安裝,你須要運行Xcode,選擇菜單「Xcode」->「Preferences」,在彈出窗口中找到「Downloads」,選擇「Command Line Tools」,點「Install」就能夠完成安裝了。

install-git-by-xcode

Xcode是Apple官方IDE,功能很是強大,是開發Mac和iOS App的必選裝備,並且是免費的!

在Windows上安裝Git

實話實說,Windows是最爛的開發平臺,若是不是開發Windows遊戲或者在IE裏調試頁面,通常不推薦用Windows。不過,既然已經上了微軟的賊船,也是有辦法安裝Git的。

Windows下要使用不少Linux/Unix的工具時,須要Cygwin這樣的模擬環境,Git也同樣。Cygwin的安裝和配置都比較複雜,就不建議你折騰了。不過,有高人已經把模擬環境和Git都打包好了,名叫msysgit,只須要下載一個單獨的exe安裝程序,其餘什麼也不用裝,絕對好用。

msysgit是Windows版的Git,從https://git-for-windows.github.io下載(網速慢的同窗請移步國內鏡像),而後按默認選項安裝便可。

安裝完成後,在開始菜單裏找到「Git」->「Git Bash」,蹦出一個相似命令行窗口的東西,就說明Git安裝成功!

install-git-on-windows

安裝完成後,還須要最後一步設置,在命令行輸入:

$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com" 

由於Git是分佈式版本控制系統,因此,每一個機器都必須自報家門:你的名字和Email地址。你也許會擔憂,若是有人故意冒充別人怎麼辦?這個沒必要擔憂,首先咱們相信你們都是善良無知的羣衆,其次,真的有冒充的也是有辦法可查的。

注意git config命令的--global參數,用了這個參數,表示你這臺機器上全部的Git倉庫都會使用這個配置,固然也能夠對某個倉庫指定不一樣的用戶名和Email地址。

建立版本庫

什麼是版本庫呢?版本庫又名倉庫,英文名repository,你能夠簡單理解成一個目錄,這個目錄裏面的全部文件均可以被Git管理起來,每一個文件的修改、刪除,Git都能跟蹤,以便任什麼時候刻均可以追蹤歷史,或者在未來某個時刻能夠「還原」。

因此,建立一個版本庫很是簡單,首先,選擇一個合適的地方,建立一個空目錄:

$ mkdir learngit $ cd learngit $ pwd /Users/michael/learngit 

pwd命令用於顯示當前目錄。在個人Mac上,這個倉庫位於/Users/michael/learngit

若是你使用Windows系統,爲了不遇到各類莫名其妙的問題,請確保目錄名(包括父目錄)不包含中文。

第二步,經過git init命令把這個目錄變成Git能夠管理的倉庫:

$ git init Initialized empty Git repository in /Users/michael/learngit/.git/ 

瞬間Git就把倉庫建好了,並且告訴你是一個空的倉庫(empty Git repository),細心的讀者能夠發現當前目錄下多了一個.git的目錄,這個目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改這個目錄裏面的文件,否則改亂了,就把Git倉庫給破壞了。

若是你沒有看到.git目錄,那是由於這個目錄默認是隱藏的,用ls -ah命令就能夠看見。

 

也不必定必須在空目錄下建立Git倉庫,選擇一個已經有東西的目錄也是能夠的。不過,不建議你使用本身正在開發的公司項目來學習Git,不然形成的一切後果概不負責。

把文件添加到版本庫

首先這裏再明確一下,全部的版本控制系統,其實只能跟蹤文本文件的改動,好比TXT文件,網頁,全部的程序代碼等等,Git也不例外。版本控制系統能夠告訴你每次的改動,好比在第5行加了一個單詞「Linux」,在第8行刪了一個單詞「Windows」。而圖片、視頻這些二進制文件,雖然也能由版本控制系統管理,但無法跟蹤文件的變化,只能把二進制文件每次改動串起來,也就是隻知道圖片從100KB改爲了120KB,但到底改了啥,版本控制系統不知道,也無法知道。

不幸的是,Microsoft的Word格式是二進制格式,所以,版本控制系統是無法跟蹤Word文件的改動的,前面咱們舉的例子只是爲了演示,若是要真正使用版本控制系統,就要以純文本方式編寫文件。

由於文本是有編碼的,好比中文有經常使用的GBK編碼,日文有Shift_JIS編碼,若是沒有歷史遺留問題,強烈建議使用標準的UTF-8編碼,全部語言使用同一種編碼,既沒有衝突,又被全部平臺所支持。

使用Windows的童鞋要特別注意:

千萬不要使用Windows自帶的記事本編輯任何文本文件。緣由是Microsoft開發記事本的團隊使用了一個很是弱智的行爲來保存UTF-8編碼的文件,他們自做聰明地在每一個文件開頭添加了0xefbbbf(十六進制)的字符,你會遇到不少難以想象的問題,好比,網頁第一行可能會顯示一個「?」,明明正確的程序一編譯就報語法錯誤,等等,都是由記事本的弱智行爲帶來的。建議你下載Notepad++代替記事本,不但功能強大,並且免費!記得把Notepad++的默認編碼設置爲UTF-8 without BOM便可:

set-utf8-notepad++

言歸正傳,如今咱們編寫一個readme.txt文件,內容以下:

Git is a version control system. Git is free software. 

必定要放到learngit目錄下(子目錄也行),由於這是一個Git倉庫,放到其餘地方Git再厲害也找不到這個文件。

和把大象放到冰箱須要3步相比,把一個文件放到Git倉庫只須要兩步。

第一步,用命令git add告訴Git,把文件添加到倉庫:

$ git add readme.txt 

執行上面的命令,沒有任何顯示,這就對了,Unix的哲學是「沒有消息就是好消息」,說明添加成功。

第二步,用命令git commit告訴Git,把文件提交到倉庫:

$ git commit -m "wrote a readme file" [master (root-commit) cb926e7] wrote a readme file 1 file changed, 2 insertions(+) create mode 100644 readme.txt

簡單解釋一下git commit命令,-m後面輸入的是本次提交的說明,能夠輸入任意內容,固然最好是有意義的,這樣你就能從歷史記錄裏方便地找到改動記錄。

嫌麻煩不想輸入-m "xxx"行不行?確實有辦法能夠這麼幹,可是強烈不建議你這麼幹,由於輸入說明對本身對別人閱讀都很重要。實在不想輸入說明的童鞋請自行Google,我不告訴你這個參數。

git commit命令執行成功後會告訴你,1個文件被改動(咱們新添加的readme.txt文件),插入了兩行內容(readme.txt有兩行內容)。

爲何Git添加文件須要addcommit一共兩步呢?由於commit能夠一次提交不少文件,因此你能夠屢次add不一樣的文件,好比:

$ git add file1.txt $ git add file2.txt file3.txt $ git commit -m "add 3 files." 

小結

如今總結一下今天學的兩點內容:

初始化一個Git倉庫,使用git init命令。

添加文件到Git倉庫,分兩步:

  • 第一步,使用命令git add <file>,注意,可反覆屢次使用,添加多個文件;

  • 第二步,使用命令git commit,完成。

相關文章
相關標籤/搜索