Git的簡史
同生活中的許多偉大事物一樣,Git 誕生于一個極富紛爭大舉創新的年代。
Linux 內核開源項目有著為數眾廣的參與者。 絕大多數的 Linux 內核維護工作都花在了提交補丁和保存歸檔的繁瑣事務上(1991-2002年間)。 到 2002 年,整個項目組開始啟用一個專有的分布式版本控制系統 BitKeeper 來管理和維護代碼。
到了 2005 年,開發 BitKeeper 的商業公司同 Linux 內核開源社區的合作關系結束,他們收回了Linux 內核社區免費使用 BitKeeper 的權力。 這就迫使 Linux 開源社區(特別是 Linux 的締造者Linux Torvalds)基于使用 BitKcheper 時的經驗教訓,開發出自己的版本系統。 他們對新的系統制訂了若干目標:
速度
簡單的設計
對非線性開發模式的強力支持(允許成千上萬個并行開發的分支)
完全分布式
有能力高效管理類似 Linux 內核一樣的超大規模項目(速度和數據量)
自誕生于 2005 年以來,Git 日臻成熟完善,在高度易用的同時,仍然保留著初期設定的目標。 它的速度飛快,極其適合管理大項目,有著令人難以置信的非線性分支管理系統。
Git迅速成為最流行的分布式版本控制系統,尤其是2008年,GitHub網站上線了,它為開源項目免費提供Git存儲,無數開源項目開始遷移至GitHub,包括jQuery,PHP,Ruby等等。
Git是什么?
Git是一款免費、開源的分布式版本控制系統,用于敏捷高效地處理任何或小或大的項目。
Git是一個開源的分布式版本控制系統,用以有效、高速的處理從很小到非常大的項目版本管理。Git 是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟件。
最原始的版本控制是純手工的版本控制:修改文件,保存文件副本。有時候偷懶省事,保存副本時命名比較隨意,時間長了就不知道哪個是新的,哪個是老的了,即使知道新舊,可能也不知道每個版本是什么內容,相對上一版作了什么修改了,當幾個版本過去后,很可能就是下面這個老土的樣子了:
Git特點
分布式相比于集中式的最大區別在于開發者可以提交到本地,每個開發者通過克隆(git clone),在本地機器上拷貝一個完整的Git倉庫。
直接記錄快照,而非差異比較 : Git 更像是把變化的文件作快照后,記錄在一個微型的文件系統中。
近乎所有操作都是本地執行 :在 Git 中的絕大多數操作都只需要訪問本地文件和資源,不用連網。
時刻保持數據完整性 :在保存到 Git 之前,所有數據都要進行內容的校驗和(checksum)計算,并將此結果作為數據的唯一標識和索引。
多數操作僅添加數據 :常用的 Git 操作大多僅僅是把數據添加到數據庫。
開發流程示意圖:
集中版本控制
CVS及SVN都是集中式的版本控制系統,而Git是分布式版本控制系統。
集中式版本控制系統,版本庫是集中存放在中央服務器的,一起工作的人需要用自己的電腦從服務器上同步更新或上傳自己的修改。
但是,所有的版本數據都存在服務器上,用戶的本地設備就只有自己以前所同步的版本,如果不連網的話,用戶就看不到歷史版本,也無法切換版本驗證問題,或在不同分支工作。。
而且,所有數據都保存在單一的服務器上,有很大的風險這個服務器會損壞,這樣就會丟失所有的數據,當然可以定期備份。
分布式版本控制
那分布式版本控制系統與集中式版本控制系統有何不同呢?
分布式版本控制系統根本沒有“中央服務器”,每個人的電腦上都是一個完整的版本庫,不需要聯網就可以工作。既然每個人電腦上都有一個完整的版本庫,那多個人如何協作呢?比方說你和同事在各自電腦修改相同文件,這時,你們倆之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。
分布式版本控制系統的安全性要高很多,因為每個人電腦里都有完整的版本庫。大家之間可以相互復制。
分布式版本控制系統通常也有一臺充當“中央服務器”的電腦,但這個服務器的作用僅僅是用來方便“交換”大家的修改,沒有它大家也一樣干活,只是交換修改不方便而已。
安裝Git
最早Git是在Linux上開發的,很長一段時間內,Git也只能在Linux和Unix系統上跑。不過,慢慢地有人把它移植到了Windows上。現在,Git可以在Linux、Unix、Mac和Windows這幾大平臺上正常運行了。
在Linux上安裝Git
首先,你可以試著輸入git,看看系統有沒有安裝Git:
$ git
像上面的命令,有很多Linux會友好地告訴你Git沒有安裝,還會告訴你如何安裝Git。
如果你碰巧用Debian或Ubuntu Linux,通過一條sudo apt-get install git就可以直接完成Git的安裝,非常簡單。如果想查看是否安裝成功,通過git --version。
如果是其他Linux版本,可以直接通過源碼安裝。先從Git官網下載源碼,然后解壓,依次輸入:./config,make,sudo make install這幾個命令安裝就好了。
安裝完成后,還需要最后一步設置,在命令行輸入:
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
因為Git是分布式版本控制系統,所以每個機器都必須自報家門:你的名字和Email地址。
注意git config命令的--global參數,用了這個參數,表示你這臺機器上所有的Git倉庫都會使用這個配置,當然也可以對某個倉庫指定不同的用戶名和Email地址。在此課程中,我們配置的環境中Git已安裝好,我們課程提供也是在Linux系統中命令進行操作。
什么是版本庫?
版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄里面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。
所以,創建一個版本庫非常簡單,首先,選擇一個合適的地方,創建一個空目錄:
$ mkdir learngit
$ cd learngit
$ pwd
/home/hubwiz/learngit
pwd命令用于顯示當前目錄。在環境中這個倉庫位于/home/hubwiz/learngit。
通過git init命令把這個目錄變成Git可以管理的倉庫:
$ git init
Initialized empty Git repository in /home/hubwiz/learngit/.git/
瞬間Git就把倉庫建好了,而且告訴你是一個空的倉庫(empty Git repository),細心的讀者可以發現當前目錄下多了一個.git的目錄,這個目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改這個目錄里面的文件,不然改亂了,就把Git倉庫給破壞了。
如果你沒有看到.git目錄,那是因為這個目錄默認是隱藏的,用ls -ah命令就可以看見。
添加文件
我們了解下版本控制系統,其實只能跟蹤文本文件的改動,比如TXT文件,網頁,所有的程序代碼等等,Git也不例外。版本控制系統可以告訴你每次的改動,比如在第5行加了一個單詞“Linux”,在第8行刪了一個單詞“Windows”。而圖片、視頻這些二進制文件,雖然也能由版本控制系統理,但沒法跟蹤文件的變化,只能把二進制文件每次改動串起來,也就是只知道圖片從100KB改成了120KB,但到底改了啥,版本控制系統不知道,也沒法知道。
為了簡明起見,我們創建一個readme.txt作為練習:
echo "Git is a version control system." > readme.txt
// 輸入這句話保存到創建的readme.txt文件中
echo " Git is free software." >> readme.txt
// 輸入此內容追加到readme.txt中
一定要放到learngit目錄下(子目錄也行),因為這是一個Git倉庫,放到其他地方Git再厲害也找不到這個文件。
用命令git add告訴Git,把文件添加到倉庫:
$ git add readme.txt
git add 實際上是個腳本命令,沒有任何顯示,說明添加成功。
提交文件
用命令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后面輸入的是本次提交的說明,可以輸入任意內容,當然最好是有意義的,這樣你就能從歷史記錄里方便地找到改動記錄。
git commit命令執行成功后會告訴你,1個文件被改動(我們新添加的readme.txt文件),插入了兩行內容(readme.txt有兩行內容)。
為什么Git添加文件需要add,commit一共兩步呢?因為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,完成。
網站上還有更多內容和對應每一小節的在線練習大家可以去試試。
http://www.hubwiz.com/course/55d301543ad79a1b05dcc4e2/