git是如何儲存資料的?
git 儲存的不是檔案差異或者變化量,而只是一系列檔案快照。
在 git 中提交時,會儲存乙個提交(commit)物件,該物件包含乙個指向暫存內容快照的指標,包含本次提交的作者等相關附屬資訊,包含零個或多個指向該提交對 象的父物件指標:首次提交是沒有直接祖先的,普通提交有乙個祖先,由兩個或多個分支合併產生的提交則有多個祖先。
為直觀起見,我們假設在工作目錄中有三個檔案,準備將它們暫存後提交。暫存操作會對每乙個檔案計算校驗和(即第一章中提到的 sha-1 雜湊字串),然後把當前版本的檔案快照儲存到 git 倉庫中(git 使用 blob 型別的物件儲存這些快照),並將校驗和加入暫存區域:
git 分支
幾乎每一種版本控制系統都以某種形式支援分支。使用分支意味著你可以從開發主線上分離開來,然後在不影響主線的同時繼續工作。在很多版本控制系統中,這是個昂貴的過程,常常需要建立乙個源**目錄的完整副本,對大型專案來說會花費很長時間。而git只生成乙個指向當前版本(又稱"快照")的指標,因此非常快捷易用。
有人把 git 的分支模型稱為「必殺技特性」,而正是因為它,將 git 從版本控制系統家族裡區分出來。git 有何特別之處呢?git 的分支可謂是難以置信的輕量級,它的新建操作幾乎可以在瞬間完成,並且在不同分支間切換起來也差不多一樣快。和許多其他版本控制系統不同,git 鼓勵在工作流程中頻繁使用分支與合併,哪怕一天之內進行許多次都沒有關係。理解分支的概念並熟練運用後,你才會意識到為什麼 git 是乙個如此強大而獨特的工具,並從此真正改變你的開發方式。
git分支管理策略
如果你嚴肅對待程式設計,就必定會使用"版本管理系統"(version control system)。
眼下最流行的"版本管理系統",非git莫屬。
相比同類軟體,git有很多優點。其中很顯著的一點,就是版本的分支(branch)和合併(merge)十分方便。有些傳統的版本管理軟體,分支操作實際上會生成乙份現有**的物理拷貝,而git只生成乙個指向當前版本(又稱"快照")的指標,因此非常快捷易用。
但是,太方便了也會產生***。如果你不加注意,很可能會留下乙個枝節蔓生、四處開放的版本庫,到處都是分支,完全看不出主幹發展的脈絡。
vincent driessen提出了乙個分支管理的策略,我覺得非常值得借鑑。它可以使得版本庫的演進保持簡潔,主幹清晰,各個分支各司其職、井井有條。理論上,這些策略對所有的版本管理系統都適用,git只是用來舉例而已。如果你不熟悉git,跳過舉例部分就可以了。
一、主分支master
首先,**庫應該有乙個、且僅有乙個主分支。所有提供給使用者使用的正式版本,都在這個主分支上發布。
git主分支的名字,預設叫做master。它是自動建立的,版本庫初始化以後,預設就是在主分支在進行開發。
二、開發分支develop
主分支只用來分布重大版本,日常開發應該在另一條分支上完成。我們把開發用的分支,叫做develop。
這個分支可以用來生成**的最新隔夜版本(nightly)。如果想正式對外發布,就在master分支上,對develop分支進行"合併"(merge)。
git建立develop分支的命令:
git checkout -b develop master
將develop分支發布到master分支的命令:
# 切換到master分支
git checkout master
# 對develop分支進行合併
git merge --no-ff develop
這裡稍微解釋一下,上一條命令的--no-ff引數是什麼意思。預設情況下,git執行"快進式合併"(fast-farward merge),會直接將master分支指向develop分支。
使用--no-ff引數後,會執行正常合併,在master分支上生成乙個新節點。為了保證版本演進的清晰,我們希望採用這種做法。關於合併的更多解釋,請參考benjamin sandofsky的《understanding the git workflow》。
三、臨時性分支
前面講到版本庫的兩條主要分支:master和develop。前者用於正式發布,後者用於日常開發。其實,常設分支只需要這兩條就夠了,不需要其他了。
但是,除了常設分支以外,還有一些臨時性分支,用於應對一些特定目的的版本開發。臨時性分支主要有三種:
* 功能(feature)分支
* 預發布(release)分支
* 修補bug(fixbug)分支
這三種分支都屬於臨時性需要,使用完以後,應該刪除,使得**庫的常設分支始終只有master和develop。
四、 功能分支
接下來,乙個個來看這三種"臨時性分支"。
第一種是功能分支,它是為了開發某種特定功能,從develop分支上面分出來的。開發完成後,要再併入develop。
功能分支的名字,可以採用feature-*的形式命名。
建立乙個功能分支:
git checkout -b feature-x develop
開發完成後,將功能分支合併到develop分支:
git checkout develop
git merge --no-ff feature-x
刪除feature分支:
git branch -d feature-x
五、預發布分支
第二種是預發布分支,它是指發布正式版本之前(即合併到master分支之前),我們可能需要有乙個預發布的版本進行測試。
預發布分支是從develop分支上面分出來的,預發布結束以後,必須合併進develop和master分支。它的命名,可以採用release-*的形式。
建立乙個預發布分支:
git checkout -b release-1.2 develop
確認沒有問題後,合併到master分支:
git checkout master
git merge --no-ff release-1.2
# 對合併生成的新節點,做乙個標籤
git tag -a 1.2
再合併到develop分支:
git checkout develop
git merge --no-ff release-1.2
最後,刪除預發布分支:
git branch -d release-1.2
六、修補bug分支
最後一種是修補bug分支。軟體正式發布以後,難免會出現bug。這時就需要建立乙個分支,進行bug修補。
修補bug分支是從master分支上面分出來的。修補結束以後,再合併進master和develop分支。它的命名,可以採用fixbug-*的形式。
建立乙個修補bug分支:
git checkout -b fixbug-0.1 master
修補結束後,合併到master分支:
git checkout master
git merge --no-ff fixbug-0.1
git tag -a 0.1.1
再合併到develop分支:
git checkout develop
git merge --no-ff fixbug-0.1
最後,刪除"修補bug分支":
git branch -d fixbug-0.1
關於使用git新建分支
git鼓勵大量使用分支 檢視分支 git branch 建立分支 git branch 切換分支 git checkout 建立 切換分支 git checkout b 合併某分支到當前分支 git merge 刪除分支 git branch d 實戰操作例子 ntbk 01 100229 ligu...
Git 10 關於Git中分支的說明
git分支中常用指令 列出所有本地分支 git branch 列出所有遠端分支 git branch r 新建乙個分支,但依然停留在當前分支 git branch branch name 新建乙個分支,並切換到該分支 git checkout b branch 合併指定分支到當前分支 git mer...
Git 合併分支 推送分支
1 本地倉庫與遠端倉庫同步,提取所有它獨有的資料到本地分支,供後續操作。git fetch origin2 把遠端倉庫中分支名為aimbranch中的 合併到本地倉庫中你當前所在的分支上。git merge no ff origin aimbranch3 把本地倉庫中你所在的分支中的 推送到遠端倉庫...