Git 基本概念
版本控製係統 (VCS)
版本控製係統 (VCS) 是軟件,幫助軟件開發人員攜手合作,他們的工作並保持完整的曆史。
以下是VCS目標
-
允許開發人員同步工作.
-
不要覆蓋對方的變化.
-
維護曆史的每一個版本.
以下是常見的VCS
-
集中式版本控製係統(CVCS)
-
分散式/分布式版本控製係統(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分支管理是很簡單的。隻需要幾秒鐘,創建,刪除和合並分支。
-
自由和開放源碼
-
快速和小
-
隱式備份
-
安全
-
不需要強大的硬件
-
更簡單的分支
DVCS術語
本地資源庫
每個VCS工具提供私有工作場所的工作副本。開發者在他的私人工作場所的變化,並提交這些更改後成為倉庫的一部分。 Git的需要這一步,為他們提供的專用副本是整個倉庫。用戶可以執行許多操作,這個庫中,如添加文件,刪除文件,重命名文件,移動文件,提交改變,還有更多。
工作目錄,暫存區域或索引
工作目錄是地方文件檢出。其他CVCS開發商一般不修改,並承諾他的變化,直接向版本庫。但Git使用不同的策略。 Git不會跟蹤每一個修改過的文件。每當提交操作,Git在目前臨時區域的文件。隻有文件被認為是目前在臨時區域提交,而不是所有修改過的文件。
讓我們來看看Git的基本工作流程。
第1步:修改文件的工作目錄。
第2步:將這些文件添加到暫存區
第3步:執行commit操作。這將文件從臨時區域。推送操作後,它永久地存儲更改的Git倉庫
假設修改了兩個文件,即 “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”
# 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/*