版本控制Git(1)——理解暫存區

一、svn和Git的比較

我們都知道傳統的源代碼管理都是以服務器爲中心的,每個開發者都直接連在中間服務器上, 本地修改,然後commit到svn服務器上。這種做法看似完美,但是有致命的缺陷。


1. 開發者不能本地跟蹤代碼版本。 所有的信息都是在服務器上。  你把本地的代碼改了很多,但是又不能提交。通常,本地只能緩存一個版本。對於小項目無所謂, 但是項目一複雜,人員多就麻煩了。 通常你本地的代碼都全是紅色的。自己都不知道今天修改了什麼, 有哪些修改是真正應該提交給svn的。

2. 因爲第一點,一旦離開服務器, 程序猿將無法正常工作。 因爲本地不能跟蹤代碼版本。  你的(幾乎)任何操作都必須連上服務器。比如, show log, blame,show history等等。

3. 中央服務器壓力過大。  因爲每個人都必須把代碼提交到服務器,並且做daily build。

4. 對於大型項目, svn幾乎不可用。 例如linux內核項目, 開發者何止幾萬? 都直接提交給svn服務器的話還不亂套了。

5. 對於個人的私人項目而言(或者對於小公司的項目), 不用版本控制當然不行,但是爲了用版本控制而專門架設svn服務器有有點捨不得。

有沒有能解決上述幾個問題的東東呢?  恩, 答案是肯定的。

Linux內核的作者也遇到了這些問題,於是他決定再一次改變世界, 重寫一個可以本地使用的svn。


如上圖,就是一個典型的Git的實際生產環境,開發者之間通過 pull和push操作, 把別人的修改拉過來,或者把自己的修改推給別人。接下來我們來詳細研究一下Git的過程。

二、Git的安裝

Linux下安裝:shell下輸入sudo apt -get install git-core,按下回車後輸入密碼,即可完成Git的安裝。

Windows下安裝:先從組織SVN庫的項目級標準工作環境目錄中,獲取Git安裝包Git-1.9.5-preview20141217.exe,完成安裝。

Windows上Git是可以在圖形界面上進行操作的,但是不建議這麼做,Git的各種命令纔是你應該掌握的,並且不管你在哪個操作系統中,使用命令操作Git肯定都是通用的。

Linux系統,打開shell界面。Windows系統,打開Git Bash。

Mac OS系統:

下載地址:https://code.google.com/p/git-osx-installer/


我早已爲大家下載好了,不用翻牆去下載。下載地址:http://download.csdn.net/detail/lxq_xsyu/8430713

安裝好後重啓控制檯,執行 git --version

lixiaoqiangdeMac-mini:Documents lixiaoqiang$ git --version

git version 1.9.3 (Apple Git-50)

三、配置身份

配置身份,git config命令如下:


還可以配置開啓顏色顯示

git config --global color.ui true

配置了身份後,我們提交代碼時Git就可以分辨是誰提交的了。

配置完成後,可以用同樣的命令(去掉最後的名字和郵箱)來查看是否配置成功.

下面我們先通過兩個命令刪除上面的配置


創建一個版本庫(用 git init  -->創建文件-->改變文件內容->git add xxx->git commit -m "xxx")


可以看到在提交的時候會失敗,提示我們設置用戶名和郵箱,我們可以通過git config -e來查看配置文件


這三個分別是版本庫級別配置文件、全局配置(用戶主目錄下)文件、系統配置文件(/etc目錄下)

四、Git和其他版本管理系統的差異

Git 和其他版本控制系統的主要差別在於,Git 只關心文件數據的整體是否發生變化,而大多數其他系統則只關心文件內容的具體差異。這類系統 (CVS,Subversion,Perforce,Bazaar 等等)每次記錄有哪些文件作了更新,以及都更新了哪些行的什麼內容,下圖是其他版本管理系統的比較文件差異示意。


Git並不保存這些前後變化的差異數據。實際上,Git 更像是把變化的文件作快照後,記錄在一個微型的文件系統中。每次提交更新時,它會縱覽一遍所有文件的指紋信息並對文件作一快照,然後保存一個指向這次快照 的索引。爲提高性能,若文件沒有變化,Git 不會再次保存,而只對上次保存的快照作一鏈接。Git 的工作方式就像下圖。


五、Git文件的三種狀態

對於任何一個文件,在 Git 內都只有三種狀態:已提交(committed),已修改(modified)和已暫存(staged)。已提交表示該文件已經被安全地保存在本地數據庫 中了;已修改表示修改了某個文件,但還沒有提交保存;已暫存表示把已修改的文件放在下次提交時要保存的清單中。

由此我們看到 Git 管理項目時,文件流轉的三個工作區域:Git 的工作目錄,暫存區域,以及本地倉庫。


六、Git的暫存區理解

Git的三個基本操作、git init 、git add 和 git commit 就我們已經知道,可以通過git status 查看文件狀態, git log --stat查看提交的文件的變更。

在我們創建版本庫的時候會自動生成一個 .git文件夾內容如下:


文件.git/index實際上是一個包含了文件索引的目錄樹,就像一個虛擬的工作區,在這個目錄樹中記錄了文件的狀態信息(時間戳和文件長度等)。文件的內容並沒有存儲在其中,而是保存在Git對象庫.git/objects目錄中,文件索引建立了文件和對象庫中實體之間的對應。


圖中的objects就是Git的對象庫,index是一個記錄文件狀態的暫存區,此時HEAD指向master分支的一個遊標。

當我們執行 git add 命令的時候,暫存區的目錄樹將被更新,同時修改的文件內存會被寫入Git的對象庫objects中。

當我們執行 git commit 命令的時候,master分支會相應更新,master新指向的目錄樹就是提交時暫存的目錄樹。

當我們執行 git reset HEAD命令的時候,暫存區的目錄樹會被重寫,會被master分支指向的目錄樹替換,但是不影響工作區。

當我們執行 git rm --cached <file>命令時,會直接從暫存區刪除文件,工作區不改變。

當我們執行 git checkout . 或 git checkout -- <file> 時,會用暫存區的全部文件或指定文件替換工作區的文件。

當我們執行 git checkout HEAD . 或 git  checkout HEAD <file>命令時,會用HEAD指向的master分支中的全部或部分文件替換暫存區和工作區中的文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章