詳解Git的基本術語和命令
譯文【51CTO.com快譯】在軟件開發界,經常有這么一種說法:“在您想進階到高級水平之前,請先了解和掌握正在使用的軟件工具的各種技術術語與操作命令。” 同理,了解Git的工作流、及其關鍵概念,將有助于您在日常使用Git的版本控制系統時,實現更高效的代碼管理。
到底Git是什么?
與其他版本控制系統(VCS)一樣,Git可用于跟蹤同一條數據信息(或文件類型)的不同版本。
然而,Git之所以能夠從其他VCS中脫穎而出,主要得益于它的分布式本質,或稱為分布式版本控制系統(distributed version control system,DVCS)。在該環境中,每個開發人員的主機都充當著“節點(node)”或“集線器(hub)”的角色。
為了維護數據的完整性,Git將每個文件系統的更改都視為新產生的數據。因此,Git的基本框架結構是由各種分支所組成,而用戶的初始項目則位于“主”分支上。此法不但促進了有效的功能性開發,還實現了簡單的錯誤修復與代碼審查。同時,頻繁的同步工作,可以持續在對等的節點之間進行合并等操作。
Git是由Linus Torvalds開發的,其背后的思想主要體現在“速度”上。“易于分支與合并”、“數據完整性”和“更大規模的協作”是其三大特點。Git能夠在本地存儲用戶整個項目的歷史記錄,并允許用戶快速地訪問到某個舊版本的數據。
Git的工作流:Git文件的三種狀態
眾所周知,許多VCS都用到了雙層體系結構:存儲庫和工作副本。但是,Git選用的卻是三層結構:工作目錄、暫存區和本地存儲庫。因此,對于同一段代碼,Git通過三個層面,提供了以不同時間間隔和版本來保存當前工作的方式。
同時,Git利用三個階段,在每個層面上存儲相同代碼(或對象)的不同(也可以是相同)狀態。
***,在初始化(或為克隆)階段,Git項目會在本地計算機上創建一個“工作目錄”,以便用戶開始編輯源代碼。
在源代碼的***階段,您既可以自由地修改文件和目錄,又能夠選擇您喜歡的編輯器來添加、刪除、移動、重命名或復制它們。當然,我更喜歡使用vim,這一最有效和***大的文本編輯器(請詳見https://www.vim.org/)。
一旦您完成了本次編輯,就可以使用“Git add”命令來暫存自己的修改,即:在“暫存區域”中進行“索引”,并顯示下一步將要提交的內容預覽。
接著,當***組代碼已被暫存到Staging區域中之后,您就可以在工作目錄中進行更多的編輯了。在此,工作目錄和暫存區域將具有當前項目的不同快照(或稱版本)。
為了同步上述兩個階段,您只需通過Git add來暫存自己在工作目錄中的***修改便可。
除了添加代碼的更改,如果您想撤消索引中的任何變更暫存的話,則需要執行不同的Git命令。
而如果您在此階段并不需要進行任何更改,那么就可以通過“Git commit”,來通過提交的方式,將代碼移動并存儲在本地的Git存儲庫之中。
也就是說,提交命令可以確保在上述所有三個階段中的項目都具有相同的快照,并讓Git的三個階段彼此保持同步。
另外,“Git status”命令可以顯示當前的工作樹狀態、以及您的文件所處的階段。
Git的關鍵術語與命令
您可能以前使用過一些比較流行的VCS,它們包括:CVS(并發版本控制系統,http://savannah.nongnu.org/projects/cvs),SVN(Apache SubVersioN,https://subversion.apache.org/),ClearCase(https://www.ibm.com/us-en/marketplace/rational-clearcase)和BitKeeper(http://www.bitkeeper.org/)等。雖然Git也是一種VCS,但是它使用了自己的文件系統架構來處理源代碼。因此,與各種早期VCS相比,Git有著自己的一些術語、以及命令方法。
存儲庫
它使用計算機上的某個本地位置,來存儲項目的整個快照,以保證每一個微小的改動都能夠被存儲與檢索。用戶可以輕松查看和檢索存儲庫的日志。也就是說,您可以跳轉到代碼的任何一個舊的狀態。
工作目錄
它為項目的***代碼提供了本地工作的副本。
索引(暫存區,緩存)
索引可以理解為用戶下一次提交的快照。一旦您通過Git add在工作目錄中暫存或添加了代碼,那么代碼就會被移動至此。就像內存中的緩存一樣,暫存區充當了工作目錄(代碼的開發位置)與本地存儲庫(代碼的存放位置)之間的中間層。在該層中,您可以快速預覽即將提交的項目快照。當然,您仍然可以在索引中編輯(添加、修改或刪除)代碼。而且,您還可以在此處還原項目的舊版本(或狀態)。
提交
提交是項目的***快照(狀態)。如下圖所示,每一次提交都會被分配一個唯一的提交ID。而且所有的提交日志都被存儲在本地的存儲庫中。
作為一個Git對象,提交會存儲各種屬性,其中包括:提交ID、作者姓名、創作日期和提交消息(標題和正文)。
git hash(或稱SHA-1)
上面提到的唯一性“提交ID”,一般被稱為“git hash”或“SHA-1”(請參見https://en.wikipedia.org/wiki/SHA-1)。通常情況下,每一個文件系統的修改(添加、刪除、編輯、移動、復制、重命名、以及文件權限等)都會被視為一個文件。同時,其內容將被轉換為唯一的SHA-1代碼。上圖所示的提交ID為:8db083e7df7c9241e640b66c89c6f02649ac885a。在實際使用中,一般參考的是其前7位唯一數,即8db083e。
當然,您不必記住整個哈希ID(下面我們將要提到),Git會使用一種諸如分支和標記之類的引用,來處置這些提交ID(哈希)。
分支
分支是某個獨立的開發“平行線”。通過分支,您可以在隔離的工作區中處理同一段代碼。由于每一個分支都有自己的項目歷史副本,因此您可以在分支上根據自己的代碼進行開發,并方便地進行相互合并。
主分支
當某個項目***被創建為Git項目時,主分支就是其主要的本地默認分支。
HEAD
HEAD是每個分支上***提交的快照。每個分支都有提交ID,如前面所說,它是SHA-1的短名稱、或是指針的引用。HEAD始終指向分支的***提交(代碼),并在每次提交時自動進行向前移動,以指向***的提交ID。
此外,當某個分支指向較舊的提交、而不是***的提交時,就會出現“detached HEAD”的概念。
可見,一旦擁有了***提交ID的引用“HEAD”,我們的確不必再去記憶那個最近工作過的提交ID了。
checkout
該命令會切換到指定的分支,并顯示當前項目的狀態。同時,它還能夠恢復以前工作過的樹文件。
克隆
克隆是遠程存儲庫的工作副本。“git clone”命令能夠下載遠程存儲庫,并在本地計算機上創建工作目錄。
此外,該命令還可以存儲那些從本地存儲庫,到遠程存儲庫的各種遠程處理程序、或指針引用。
上圖顯示了一個名為“learn_branching”的本地存儲庫,它使用URL:https://github.com/divyabhushan/learn_branching.git,來跟蹤名為“origin”的遠程存儲庫。
結論
希望上面所提及的基本概念,能夠讓您更好地理解使用Git的各種有效方法。當然,Git還包含了更多的概念與實用命令,您可以通過“git help -a”,來拉出全量的命令列表,并通過“git help
原文標題:Git: Basic Terms and Commands Explained,作者:Divya Bhushan
【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】