- Git 入門
- Git - 首頁
- Git - 版本控制
- Git - 基本概念
- Git - 命令列
- Git - 安裝
- Git - 首次設定
- Git - 基本命令
- Git - 獲取幫助
- Git - 工具
- Git - 速查表
- Git - 術語
- Git 分支
- Git - 簡述分支
- Git - 建立新分支
- Git - 切換分支
- Git - 分支和合並
- Git - 合併衝突
- Git - 管理分支
- Git - 分支工作流程
- Git - 遠端分支
- Git - 跟蹤分支
- Git - 變基
- Git - 變基與合併
- Git - 合併提交
- Git 操作
- Git - 克隆操作
- Git - 打標籤操作
- Git - 別名操作
- Git - 提交操作
- Git - 暫存操作
- Git - 移動操作
- Git - 重新命名操作
- Git - 推送操作
- Git - 拉取操作
- Git - Fork 操作
- Git - 修補操作
- Git - 差異操作
- Git - 狀態操作
- Git - 日誌操作
- Git - HEAD 操作
- Git - origin master
- Git 撤銷
- Git - 撤銷更改
- Git - 檢出
- Git - 恢復
- Git - 重置
- Git - 恢復操作
- Git - Rm
- Git - 切換操作
- Git - Cherry-pick
- Git - 修正
- Git 在伺服器上
- Git - 本地協議
- Git - 智慧 HTTP 協議
- Git - 啞 HTTP 協議
- Git - SSH 協議
- Git - Git 協議
- Git - 在伺服器上獲取 Git
- Git - 設定伺服器
- Git - 守護程序
- Git - GitWeb
- Git - GitLab
- Git - 第三方託管選項
- 分散式 Git
- Git - 分散式工作流程
- Git - 為專案做貢獻
- Git - 維護專案
- 自定義 Git
- Git - 配置
- Git - 鉤子
- Git - 屬性
- Git - Init
- Git - 提交
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 的主分支,該分支最初指向我們最新的提交。
主分支的更新
當我們進行更改和提交時,master 分支指標會自動重新整理以指向最新的提交。
這保證了專案的最新快照始終反映在 master 分支中。
建立新分支
在 Git 中,新建立的分支會建立一個新的指標來監控備用開發路徑。
考慮一個名為 master 的分支專案,該分支指向專案歷史記錄中的特定提交。
使用以下命令建立分支
$ git branch feature-xyz
此命令建立一個名為 feature-xyz 的分支,該分支指向與 master 分支相同的提交。
分支充當書籤或標籤。feature-xyz 分支和 master 將指向相同的提交。
跟蹤當前分支
Git 使用一個名為 HEAD 的特殊指標來跟蹤當前活動的分支。
建立新分支時,HEAD 仍然指向 master 分支,表示當前工作分支保持 master,直到明確切換。
帶有 --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 保持不變。
在分支切換後,每個分支的狀態可能會發生分歧。
執行這些命令後,將在當前活動分支 feature-xyz 上建立一個新的提交。
例如
$ vim update_script.py $ git commit -a -m 'Enhance script functionality'
master 分支仍然位於切換到 feature-xyz 之前指向的提交處,但 feature-xyz 分支已前進以包含此時的新提交。
切換回 master
使用以下命令切換回 master 分支。
$ git checkout master
這會更新 HEAD 以指向 master 分支,從而使 master 再次成為活動分支。
它會更新工作目錄中的檔案以匹配 master 指向的提交的狀態。
這會導致工作分歧,因為在 feature-xyz 上進行的更改不會反映在 master 上,反之亦然。
讓我們進行一些其他更改,然後提交
$ vim notes.txt $ git commit -a -m 'Add notes for upcoming features'
透過執行上述命令,將在當前活動分支 master 上建立一個新的提交。
master 分支現在包含不同的更改,例如即將推出的功能的說明。
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 還透過自動識別合併基數和記錄提交父級來簡化合並過程。
這種效率和自動化促進了頻繁的分支和靈活的開發工作流程。