簡單清晰的 Git 版本控制(四)------ Git 分支(1)

分支是 Git 的利器,有了分支,開發人員可以獨立做不同的事情而事情之間不會干擾。

何爲分支

先了解 Git 是怎樣存儲數據的。假設有3個文件需要跟蹤,將他們添加到暫存區域後,會爲每個文件計算校驗和,然後保存文件快照到 Git 倉庫中(Git 使用 blob 類型的對象存儲這些快照)。

使用 git commit 提交後,Git 會將已跟蹤的數據保存爲樹(tree)對象,樹對象中保存了各個校驗和的索引,然後建立一個提交對象,其中包含了指向樹對象的指針,另外,提交對象中還保存了作者和提交者等信息。

現在,Git 倉庫中有五個對象:三個表示文件快照內容的 blob 對象;一個記錄着目錄樹內容及其中各個文件對應 blob 對象索引的 tree 對象;以及一個包含指向 tree 對象(根目錄)的索引和其他提交信息元數據的 commit 對象。

作些修改後再次提交,這次的提交對象就會包含一個指向上次提交對象的指針(即下圖中的 parent 對象)。兩次提交後,倉庫歷史會變成這個樣子

Git 中的分支,其實本質上僅僅是個指向 commit 對象的可變指針。Git 使用 master 作爲分支的默認名字。在若干次提交後,就已經有了一個指向最後一次提交對象的 master 分支,它在每次提交的時候都會自動向前移動。

使用如下命令可以創建一個新的分支(也就是新的指向 commit 對象的指針)

$ git branch testing      # 創建 testing 分支

Git 保存了一個名爲 HEAD 的特別指針,指向當前工作的本地分支,可以認爲他是當前本地分支的別名。

需要注意的是:運行 git branch 命令,僅僅是建立了一個新的分支,但不會自動切換到這個分支中去。

切換分支:git checkout 分支名

運行 git checkout testing ,HEAD 就指向了 testing 分支。

如果此時在 testing 分支工作,修改文件並提交,testing 就會向前移動,同時 HEAD 也會跟着移動。

如果再切換到 master 分支,就會暫時放棄 testing 分支時的修改,而是回到了比較舊的版本,此時在此基礎上重新修改並提交,就會產生新的版本,是不同於 testing 修改提交的版本,這時兩個版本就出現了分歧,也就是分支開始走向不同的方向。

Git 分支的新建與合併

假設你的項目已經進行了好幾次提交

此時想給項目添加一個新的特性,於是建立了 iss53 分支,來開發新特性。

git checkout -b 分支名 :加上 -b 參數可以建立分支並切換到該分支

於是,執行 git checkout -b iss53

相當於執行

$ git branch iss53
$ git checkout iss53

現在的狀態圖是這樣的

經過幾次提交的狀態變成這樣的

此時項目有個 bug 需要緊急修復,於是創建一個新的分支來修復項目問題。

此時需要切換回 master 分支,然後在此分支上分出新的分支。不過在切換之前,需要將工作區的修改以及暫存區全部提交,否則會阻止切換到 master 分支。

切換到 master 分支後,執行  git checkout -b 'hotfix'  創建 hotfix 分支並切換到該分支。

可以發現,切換到 master 後再創建分支,就會在 master 所指的節點創建新的分支(岔路口)

修復完成後,就將 hotfix master 合併,然後發佈到生產服務器。

git merge 分支名:將當前分支和分支名標識的分支合併

於是重新切換到  master 執行 git merge hotfix此時的狀態圖是這樣的。

由於 master 分支是在 hotfix 分支的直接上游,因此 master 可以直接右移到 hotfix 指向的節點,因爲這種單線的歷史分支不存在任何需要解決的分歧,所以這種合併過程可以稱爲快進Fast forward)。

此時 master 分支和 hotfix 指向同一個節點,可以刪除 hotfix 分支了

git branch -d 分支名:刪除分支

於是執行 git branch -d hotfix ,此時修復已經完成,可以繼續新特性的開發了,於是切換到 iss53 分支接着工作。

此時新特性開發好了,需要合併到 master 分支中,於是切換到 master 分支,執行合併操作。

$ git checkout master

$ git merge iss53

master hotfix 合併不同的是,master 並不在 iss53 的直接上游,而是處在兩個分叉的分支末尾。

對於這種分支的合併,Git 的處理方式是:

Git 會用兩個分支的末端(C4 和 C5)以及它們的共同祖先(C2)進行一次簡單的三方合併計算,對三方合併後的結果重新做一個新的快照,並自動創建一個指向它的提交對象(C6)。Git 可以自己裁決哪個共同祖先纔是最佳合併基礎。

合併完成後,就可以刪除 iss53 分支了

執行 git branch -d iss53

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章