## 版本控制系統 (VCS)
版本控制系統 (VCS) 是軟件,幫助軟件開發人員攜手合作,他們的工作并保持完整的歷史。
以下是VCS目標
1. 允許開發人員同步工作.
2. 不要覆蓋對方的變化.
3. 維護歷史的每一個版本.
以下是常見的VCS
1. 集中式版本控制系統(CVCS)
2. 分散式/分布式版本控制系統(DVCS)
在這個教程,我們將介紹集中分布式的版本控制系統,尤其是Git。 Git 屬于分布式版本控制系統。
## 分布式版本控制系統(DVCS)
集中式版本控制系統采用中央服務器上存儲的所有文件和實現團隊協作。但是CVCS主要缺點是中央服務器的單點故障,即故障。不幸的是,如果中央服務器宕機一小時,然后在該時段沒有人可以合作。即使在最壞的情況下,如果中央服務器的磁盤被損壞,并沒有采取適當的備份,那么將失去整個項目的歷史。
DVCS客戶不僅檢出的最新快照目錄,但他們也完全反映資源庫。如果SEVER停機,然后從任何客戶端庫可以復制回服務器,以恢復它。每個結賬是完整的版本庫備份。 Git不會依賴中央服務器,這就是為什么可以執行許多操作,當處于脫機狀態。可以提交修改,創建分支視圖日志和執行其他操作,當處于脫機狀態。只需要網絡連接,發布您的更改,并采用最新變化。
## Git優勢
Git是GPL開源許可證下發布的。它可自由在互聯網上。可以使用Git來管理項目無需支付一分錢。由于它是開源的,可以下載它的源代碼,并根據要求進行更改。
由于大部分的操作都在本地執行,它給人帶來巨大的好處,在速度方面。 Git 不依賴于中央服務器,為什么每一個操作就沒有必要與遠程服務器進行交互。 Git核心部分是寫在C中,從而避免了與其他高級語言的運行時開銷。雖然 Git中反映整個存儲庫,在客戶端上的數據的大小是小的。這說明它是在客戶端上的數據壓縮和存儲的效率有多高。
丟失數據的機會是非常罕見的,當有多個副本。存在于任何客戶端的數據存儲庫中,因此它可以被用來在發生崩潰或磁盤損壞的鏡像。
Git使用常見的加密散列函數,稱為安全的哈希算法(SHA1)命名,并確定在其數據庫中的對象。每一個文件并提交檢查總結和檢索其校驗在結賬的時候。意思是說,這是不可能改變文件,日期,提交信息和且從Git 數據庫不知道Git 任何其他數據。
在CVCS情況下,中心服務器需要足夠強大,要求整個團隊服務。對于較小的團隊,這是不是一個問題,但隨著團隊規模的增長,服務器的硬件限制可能成為一個性能瓶頸。在DVCS開發的情況下不與服務器進行交互,除非他們需要推或拉的變化。所有繁重發生在客戶端上,所以服務器硬件可以是很簡單的。
CVCS使用廉價的復制機制,這意味著如果我們創建新的分支,它會復制到新分支的所有代碼,所以它的耗時和效率不高。另外CVCS的分支的刪除和合并是復雜和費時的。但是,使用Git分支管理是很簡單的。只需要幾秒鐘,創建,刪除和合并分支。
1. 自由和開放源碼
2. 快速和小
3. 隱式備份
4. 安全
5. 不需要強大的硬件
6. 更簡單的分支
## DVCS術語
### 本地資源庫
每個VCS工具提供私有工作場所的工作副本。開發者在他的私人工作場所的變化,并提交這些更改后成為倉庫的一部分。 Git的需要這一步,為他們提供的專用副本是整個倉庫。用戶可以執行許多操作,這個庫中,如添加文件,刪除文件,重命名文件,移動文件,提交改變,還有更多。
### 工作目錄,暫存區域或索引
工作目錄是地方文件檢出。其他CVCS開發商一般不修改,并承諾他的變化,直接向版本庫。但Git使用不同的策略。 Git不會跟蹤每一個修改過的文件。每當提交操作,Git在目前臨時區域的文件。只有文件被認為是目前在臨時區域提交,而不是所有修改過的文件。
讓我們來看看Git的基本工作流程。
第1步:修改文件的工作目錄。
第2步:將這些文件添加到暫存區
第3步:執行commit操作。這將文件從臨時區域。推送操作后,它永久地存儲更改的Git倉庫
<center>

</center>
假設修改了兩個文件,即 “sort.c” and “search.c” ,兩種不同分別 提交操作。可以添加一個文件分段區域,不提交。第一次提交后重復相同的步驟為另一個文件。
# First commit
[bash]$ git add sort.c
# adds file to the staging area
[bash]$ git commit –m “Added sort operation”
<br/>
# Second commit
[bash]$ git add search.c
# adds file to the staging area
[bash]$ git commit –m “Added search operation”
### BLOBS
BLOB代表二進制大對象。為代表 blob文件的每個版本。一個blob保存文件數據,但不包含任何有關文件的元數據。它是一個二進制文件,該文件它被命名為SHA1哈希 Git數據庫中。在Git中,文件未提及的名字。一切固定內容尋址。
### Tree
樹是一個對象,它表示一個目錄。它擁有blobs以及其他子目錄。一棵樹是一個二進制文件,該文件存儲Blob樹,也被命名為樹對象的SHA1哈希的引用。
### Commit
提交持有的庫的當前狀態。COMMIT命令同樣由SHA1哈希的名字命名。可以考慮commit對象的鏈表節點。每個提交的對象有父commit 對象的指針。從給定的承諾可以遍歷尋找在父指針,查看歷史記錄的提交。如果提交多個父承諾,這意味著特定的提交是由兩個分支合并。
### BRANCHES
分支用來創建另一條線的發展。默認情況下,Git的主分支,這是一樣軀干顛覆。平時要工作的新功能創建一個分支。功能完成后,它被合并回master分支,我們刪除分支。每個分支所引用HEAD,這點在分支的最新提交。每當做出了一個提交,HEAD更新為最新提交。
### TAGS
包括特定版本庫中的標簽分配一個有意義的名稱。標簽是非常相似的分支,但不同的是,標簽是不可改變的。手段標記的一個分支,沒有人打算修改。一旦標簽被創建為特定的提交,即使創建一個新的提交,也不會被更新。通常開發人員創建標簽的產品發布。
### CLONE
克隆操作的庫創建實例。克隆操作不僅檢出的工作拷貝,但它也反映了完整的信息庫。用戶可以執行許多操作,這個本地倉庫。網絡介入是唯一的一次,當正在同步資料庫實例。
### PULL
Pull操作復制的變化,本地的一個實例來從遠程倉庫。Pull操作是用于兩個存儲庫實例之間的同步。這是在Subversion更新操作一樣。
### PUSH
推動從本地存儲庫實例的遠程操作副本的變化。這是用來儲存到Git倉庫中永久改變。這是在Subversion的提交操作相同。
### HEAD
HEAD指針總是指向分支的最新提交。每當你做出了一個提交,HEAD更新為最新提交。HEAD樹枝存儲在.git/refs/heads/ 目錄中。
[CentOS]$ ls -1 .git/refs/heads/
master
[CentOS]$ cat .git/refs/heads/master
570837e7d58fa4bccd86cb575d884502188b0c49
### REVISION
修訂版本的源代碼。在Git修訂代表的提交。這些提交由SHA1安全哈希值確定。
### URL
URL代表的Git倉庫的位置。 Git 的URL存儲在配置文件中。
[tom@CentOS tom_repo]$ pwd
/home/tom/tom_repo
[tom@CentOS tom_repo]$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = gituser@git.server.com:project.git
fetch = +refs/heads/*:refs/remotes/origin/*