W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
為了真正理解 Git 處理分支的方式,我們需要回顧一下 Git 是如何保存數(shù)據(jù)的。
或許你還記得 Chapter?1 的內(nèi)容,Git 保存的不是文件的變化或者差異,而是一系列不同時刻的文件快照。
在進行提交操作時,Git 會保存一個提交對象(commit object)。知道了 Git 保存數(shù)據(jù)的方式,我們可以很自然的想到——該提交對象會包含一個指向暫存內(nèi)容快照的指針。但不僅僅是這樣,該提交對象還包含了作者的姓名和郵箱、提交時輸入的信息以及指向它的父對象的指針。首次提交產(chǎn)生的提交對象沒有父對象,普通提交操作產(chǎn)生的提交對象有一個父對象,而由多個分支合并產(chǎn)生的提交對象有多個父對象,
為了說得更加形象,我們假設(shè)現(xiàn)在有一個工作目錄,里面包含了三個將要被暫存和提交的文件。暫存操作會為每一個文件計算校驗和(使用我們在 Chapter?1 中提到的 SHA-1 哈希算法),然后會把當(dāng)前版本的文件快照保存到 Git 倉庫中(Git 使用 blob 對象來保存它們),最終將校驗和加入到暫存區(qū)域等待提交:
$ git add README test.rb LICENSE
$ git commit -m 'The initial commit of my project'
當(dāng)使用 git commit
進行提交操作時,Git 會先計算每一個子目錄(本例中只有項目根目錄)的校驗和,然后在 Git 倉庫中這些校驗和保存為樹對象。隨后,Git 便會創(chuàng)建一個提交對象,它除了包含上面提到的那些信息外,還包含指向這個樹對象(項目根目錄)的指針。如此一來,Git 就可以在需要的時候重現(xiàn)此次保存的快照。
現(xiàn)在,Git 倉庫中有五個對象:三個 blob 對象(保存著文件快照)、一個樹對象(記錄著目錄結(jié)構(gòu)和 blob 對象索引)以及一個提交對象(包含著指向前述樹對象的指針和所有提交信息)。
Figure 3-2. 提交對象及其父對象
Git 的分支,其實本質(zhì)上僅僅是指向提交對象的可變指針。Git 的默認(rèn)分支名字是 master
。在多次提交操作之后,你其實已經(jīng)有一個指向最后那個提交對象的 master
分支。它會在每次的提交操作中自動向前移動。
Git 的 “master” 分支并不是一個特殊分支。它就跟其它分支完全沒有區(qū)別。之所以幾乎每一個倉庫都有 master 分支,是因為 git init
命令默認(rèn)創(chuàng)建它,并且大多數(shù)人都懶得去改動它。
Figure 3-4. 兩個指向相同提交歷史的分支
那么,Git 又是怎么知道當(dāng)前在哪一個分支上呢?也很簡單,它有一個名為 HEAD
的特殊指針。請注意它和許多其它版本控制系統(tǒng)(如 Subversion 或 CVS)里的 HEAD
概念完全不同。在 Git 中,它是一個指針,指向當(dāng)前所在的本地分支(譯注:將 HEAD
想象為當(dāng)前分支的別名)。在本例中,你仍然在 master
分支上。因為 git branch
命令僅僅 創(chuàng)建 一個新分支,并不會自動切換到新分支中去。
Figure 3-6. HEAD 指向當(dāng)前所在的分支
那么,這樣的實現(xiàn)方式會給我們帶來什么好處呢?現(xiàn)在不妨再提交一次:
$ vim test.rb
$ git commit -a -m 'made a change'
Figure 3-8. 檢出時 HEAD 隨之移動
這條命令做了兩件事。一是使 HEAD 指回 master
分支,二是將工作目錄恢復(fù)成 master
分支所指向的快照內(nèi)容。也就是說,你現(xiàn)在做修改的話,項目將始于一個較舊的版本。本質(zhì)上來講,這就是忽略 testing
分支所做的修改,以便于向另一個方向進行開發(fā)。
分支切換會改變你工作目錄中的文件
在切換分支時,一定要注意你工作目錄里的文件會被改變。如果是切換到一個較舊的分支,你的工作目錄會恢復(fù)到該分支最后一次提交時的樣子。如果 Git 不能干凈利落地完成這個任務(wù),它將禁止切換分支。
我們不妨再稍微做些修改并提交:
$ vim test.rb
$ git commit -a -m 'made other changes'
現(xiàn)在,這個項目的提交歷史已經(jīng)產(chǎn)生了分叉(參見 Figure?3-9)。因為剛才你創(chuàng)建了一個新分支,并切換過去進行了一些工作,隨后又切換回 master 分支進行了另外一些工作。上述兩次改動針對的是不同分支:你可以在不同分支間不斷地來回切換和工作,并在時機成熟時將它們合并起來。而所有這些工作,你需要的命令只有 branch
、checkout
和 commit
。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: