Git 分支



什麼是分支

分支只是指向歷史記錄中特定提交的指標。它代表專案中獨立的開發線。

在 VCS 中,分支是一個常見的功能,允許開發人員在不影響主開發的情況下處理不同的程式碼行。

傳統的 VCS 工具在建立分支時可能會很慢,尤其是在大型專案中。這種速度下降是由於為每個新分支複製整個程式碼庫造成的。

Git 在 VCS 中憑藉其輕量級分支模型而脫穎而出,允許非常快速地建立和切換分支。

  • 這種效率來自 Git 與許多其他 VCS 工具不同,它不會為每個分支複製整個程式碼庫。

  • 這使得可以頻繁地進行分支和合並,甚至可能每天進行多次。

  • 透過掌握 Git 的分支,開發人員可以顯著提高其工作流程和生產力。

Git 與其他 VCS

Git 與其他 VCS 在儲存資料的方式上有所不同。與一系列修改相比,它利用了多個快照。

  • 在 Git 中,每次提交都會拍攝程式碼在那一特定時刻的狀態的快照。

  • 此快照以提交物件的形式儲存,其中包含有關作者、訊息和與其引用的父提交的詳細資訊。

  • 常規提交有一個父提交,合併(合併分支)有多個父提交,而第一次提交則沒有父提交。

暫存和提交

Git 會跟蹤為特定提交暫存的檔案。

  • 命令 git add 用於標記應包含在提交中的檔案。

  • Git 為每個暫存的檔案生成一個獨特的校驗和(SHA-1 雜湊值),準確地反映了該特定時刻的內容。

  • 儲存庫將這些校驗和儲存為 blob

建立快照

Git 會跟蹤每次提交時整個專案的狀態。

  • 當我們使用 git commit 命令時,Git 會生成整個專案目錄結構的快照。

  • 包含的檔案(blob)及其相應的校驗和以對映格式列出,稱為 tree 物件,這就是儲存此快照的方式。

提交物件

Git 透過建立提交物件來表示提交。

  • 元資料(如作者詳細資訊、提交訊息、時間戳,最重要的是指向根樹物件的指標)儲存在此物件中。

  • 使用此指標,Git 可以重建該特定提交時的精確專案狀態。

提交鏈

  • 我們進行的每次提交都會新增對(指向)之前提交的引用。

  • 透過這樣做,建立了一個提交的時間順序鏈,連線提交併讓我們訪問專案的歷史記錄。

使用分支

  • 對於提交鏈,Git 使用 分支作為可移動的輕量級指標。

  • 這些是指示某些提交歷史點書籤。

  • 預設情況下,Git 會建立一個名為 master 的主分支,該分支最初指向我們最新的提交。

git branch3

主分支的更新

  • 當我們進行更改和提交時,master 分支指標會自動重新整理以指向最新的提交。

  • 這保證了專案的最新快照始終反映在 master 分支中。

建立新分支

在 Git 中,新建立的分支會建立一個新的指標來監控備用開發路徑。

考慮一個名為 master 的分支專案,該分支指向專案歷史記錄中的特定提交。

使用以下命令建立分支

 $ git branch feature-xyz
 

此命令建立一個名為 feature-xyz 的分支,該分支指向與 master 分支相同的提交。

分支充當書籤或標籤。feature-xyz 分支和 master 將指向相同的提交。

git branchA

跟蹤當前分支

Git 使用一個名為 HEAD 的特殊指標來跟蹤當前活動的分支。

建立新分支時,HEAD 仍然指向 master 分支,表示當前工作分支保持 master,直到明確切換。

git branchB

帶有 --decorate 選項的 git log 命令顯示分支指標在提交歷史記錄中的指向位置。

$ git log --decorate

輸出如下所示

f55bc (HEAD -> master, feature-xyz) Add support for new file formats
54bd2 Fix crash issue under heavy load conditions
88ba6 Initial setup and configuration

git log --decorate 中的 --decorate 選項提供了 HEAD 和分支指標的視覺化表示。

切換分支

要更改活動分支並將 HEAD 更新為指向 feature-xyz 分支,請使用

$ git checkout feature-xyz

此命令更新 HEAD 以引用 feature-xyz,因此任何將來的更改和提交都將記錄在 feature-xyz 上,而 master 保持不變。

git branchC

在分支切換後,每個分支的狀態可能會發生分歧。

執行這些命令後,將在當前活動分支 feature-xyz 上建立一個新的提交。

例如

$ vim update_script.py
$ git commit -a -m 'Enhance script functionality'

master 分支仍然位於切換到 feature-xyz 之前指向的提交處,但 feature-xyz 分支已前進以包含此時的新提交。

git branchD

切換回 master

使用以下命令切換回 master 分支。

$ git checkout master

這會更新 HEAD 以指向 master 分支,從而使 master 再次成為活動分支。

git branchE

它會更新工作目錄中的檔案以匹配 master 指向的提交的狀態。

這會導致工作分歧,因為在 feature-xyz 上進行的更改不會反映在 master 上,反之亦然。

讓我們進行一些其他更改,然後提交

$ vim notes.txt
$ git commit -a -m 'Add notes for upcoming features'

透過執行上述命令,將在當前活動分支 master 上建立一個新的提交。

master 分支現在包含不同的更改,例如即將推出的功能的說明。

git branchF

git log --oneline --decorate --graph --all 命令提供了提交和分支的清晰視覺化歷史記錄,還說明了它們之間的關係和分歧。

$ git log --oneline --decorate --graph --all
* 9d0f1 (HEAD -> master) Add notes for upcoming features
| * 6a1b2 (feature-xyz) Enhance script functionality
|/
* f55bc Add support for new file formats
* 54bd2 Fix crash issue under heavy load conditions
* 88ba6 Initial setup and configuration

總結

  • Git 分支的建立和刪除幾乎是即時的,因為它們只是包含提交的 40 個字元 SHA-1 校驗和的檔案。

  • 這允許高效地管理分支。

  • Git 的方法省去了為新分支複製整個目錄的耗時步驟,而舊的版本控制系統需要此步驟。

  • Git 還透過自動識別合併基數和記錄提交父級來簡化合並過程。

  • 這種效率和自動化促進了頻繁的分支和靈活的開發工作流程。

廣告

© . All rights reserved.