Git分支

  • 分支
  • 分支的本質
  • 分支創建、刪除、合併
  • 分支的合併與衝突
  • git stash
  • 分支管理策略
  • 主分支
  • 輔助分支

分支

在 Git 中,分支(Branch)是一種輕量級的指針,它的核心作用是幫助開發者在不干擾主線代碼的前提下,獨立記錄和管理代碼的修改歷史。

為什麼得分支?
想象一個場景:正在研發一個項目,主線的代碼已經能穩定運行,此時應該製作一個新功能或需要修復一個緊急 bug。如果直接在主線修改,可能會導致主線代碼暫時不穩定,甚至影響其他開發者的工作,而分支的出現處理了這個難題,可以從主線分出一個新分支,在這個分支上專注開發,直到能力完成且測試通過後,再將修改合併回主線。這樣既保證了主線的穩定性,又實現了並行開發。

分支的本質

Git 分支的本質是一個指向特定提交(commit)的輕量級指針

Git 初始化倉庫時(git init)會默認創建一個主分支,該分支通常命名為 master。這個默認分支與其他分支在本質上沒有區別,它們都是指向提交的指針,唯一的特殊性僅在於默認創建這一初始化行為。默認分支最初指向倉庫的第一個提交(初始提交),當在該分支上進行提交時,分支指針會自動隨新提交向前移動,最終指向該分支的最新提交(即提交鏈的末端)。

此外,Git 中存在一個特殊的 HEAD 指針,它始終指向當前正在工作的分支。例如,當你在 master 分支上時,HEAD 指向 master 分支,而 master 分支指向其最新提交,形成 “HEAD -> 分支 -> 提交” 的指向關係;若切換到其他分支,HEAD 會轉而指向該分支,後續在該分支上的新提交會讓分支指針自動前移,始終指向最新的提交。

Git 教程之分支管理詳解_相關技巧_txt文件

第二張圖上我們可以看到創建了dev的分支,當我們切換到dev分支的時候HEAD就會指向dev

Git 教程之分支管理詳解_相關技巧_出棧_02

進入.git文件夾查看HEAD的內容,所處分支不同,內部的資料指向就不同

Git 教程之分支管理詳解_相關技巧_git_03

若是dev發生修改提交,dev的版本就會向後移動

Git 教程之分支管理詳解_相關技巧_git_04

在master分支上如果進行合併分支就會出現如下圖

Git 教程之分支管理詳解_相關技巧_出棧_05

分支創建、刪除、合併

通過 git branch 來查看和創建分支,創建標籤記在HEAD指針所指向的提交點創建分支
git branch dev

Git 教程之分支管理詳解_相關技巧_出棧_06

分支切換到dev分支 git checkout dev

Git 教程之分支管理詳解_相關技巧_git_07

創建分支與切換分支同時完成 git checkout -b dev2

Git 教程之分支管理詳解_相關技巧_txt文件_08

切換到最近一次上一次的分支 git checkout -

Git 教程之分支管理詳解_相關技巧_出棧_09

在dev2分支創建一個材料A.txt,文件進入工作區,在其他分支上均可看到A.txt文件,且該材料狀態均為工作區狀態。在dev2分支將記錄A.txt添加到暫存區後,在其他分支上也均可看到A.txt文件,且該文件狀態均為暫存區狀態。

Git 教程之分支管理詳解_相關技巧_git_10


Git 教程之分支管理詳解_相關技巧_txt文件_11


Git 教程之分支管理詳解_相關技巧_git_12

在dev2分支提交A.txt文件至版本庫,僅在dev2分支可以看到此記錄,當切換到其他分支時則均無法看到此文件。

Git 教程之分支管理詳解_相關技巧_git_13

可以刪除一個合併後的或者沒有發生變化的分支 git branch -d dev

Git 教程之分支管理詳解_相關技巧_出棧_14

不能刪除自己所在的分支

Git 教程之分支管理詳解_相關技巧_txt文件_15

如果一個分支發生了變化,沒有合併不能刪除,如果要強制刪除可以使用 git branch -D dev2

Git 教程之分支管理詳解_相關技巧_git_16

分支的合併與衝突

切換到master上做dev2 的合併,git merge dev2
發現master分支上也添加了A.txt這個文件

Git 教程之分支管理詳解_相關技巧_txt文件_17

如果修改的是同一個文件也可以做分支合併,通過合併發現master分支上也合併了dev2修改的內容,合併之後dev2的刪除就被允許了

Git 教程之分支管理詳解_相關技巧_git_18

此時我們在 dev2 分支裏修改 A.txt 資料添加一行 dev2 00001 後提交,在 master 分支裏面修改 A.txt 資料同時添加一行 master 00002 後提交

合併的時候發現出現分支衝突

Git 教程之分支管理詳解_相關技巧_git_19

<<<<<<< HEAD 當前指向的分支所修改的內容
======= 分隔線,上下分別是兩個分支的衝突內容
>>>>>>> dev2 dev2分支所修改的內容

需要手工合併,根據實際需求,決定保留哪部分內容或整合兩者

Git 教程之分支管理詳解_相關技巧_txt文件_20

修改完後,在dev2分支下的A.txt文件內容也跟着更新了

Git 教程之分支管理詳解_相關技巧_txt文件_21

可以通過圖形來查看衝突的提交日誌 git log --graph

Git 教程之分支管理詳解_相關技巧_txt文件_22

git stash

git stash 是 Git 中用於臨時保存工作區和暫存區修改的命令。在當前分支做了一些未完成的修改(不想立即提交),但需要臨時切換到其他分支時,可通過 git stash 將這些修改暫存起來,讓工作區恢復到乾淨狀態(與最近一次提交一致),方便進行其他操作。

最新的暫存就是在dev分支修改 A.txt、新增 b.txt,git stash 將內容保存至堆棧中,再新增 c.txt,將其添加至暫存區,再將內容保存至堆棧中,棧頂
git stash list 列出堆棧區保存的所有未完畢的任務
git stash pop 出棧,恢復並刪除暫存

Git 教程之分支管理詳解_相關技巧_txt文件_23

可以在任意分支上取出並繼續完成任務,需要注意的是出棧一個任務並提交後才能夠出棧另一個任務

在 master 分支上出棧

Git 教程之分支管理詳解_相關技巧_出棧_24

分支管理策略

Git 教程之分支管理詳解_相關技巧_出棧_25

從上圖可以看到關鍵包含下面幾個分支:

  • master:git默認主分支(這裏不作運行)
  • stable:穩定分支,替代master,主要用來版本發佈
  • develop:日常開發分支,該分支正常保存了開發的最新代碼
  • feature:具體的功能開發分支,只與 develop 分支交互
  • release:release 分支可能認為是 stable分支的未測試版
  • bugfix:線上 bug 修復分支

在 Git 分支管理中,主分支(Main Branches) 和輔助分支(Supporting Branches) 是兩類效果互補的分支,共同支撐項目的研發、測試、發佈和維護流程。

主分支

因為master分支大家不作管理,存放可部署到生產環境的穩定代碼,針對stable和develop這兩個主分支來講解。
stable分支:用來發布,管理着多個穩定的版本
develop分支:開發階段的主分支,整合所有已完成的效果研發,是測試環境的代碼源
啓用這兩個分支就具有了最方便的開發模式:develop 分支用來開發功能,開發完成並且測試沒有問題後,則將 develop 分支的代碼合併到 stable分支併發布。

Git 教程之分支管理詳解_相關技巧_出棧_26

輔助分支

從主分支(或其他輔助分支)派生的臨時分支,用於隔離特定任務(如開發新功能、修復 bug、準備發佈等),任務做完後需合併回目標分支並刪除,避免長期存在導致代碼混亂。就是輔助分支

Feature分支
feature 分支用來開發具體的功能,一般基於develop分支,最後做完功能後再合併到develop分支。
比如,目前我們針對develop分支來做功能編寫,在開發的過程中會有緊急需求需要構建,且在本次版本發佈時間之前要能測試完成。我們允許基於之前穩定版本另開一個feature分支來做緊急需求的開發,發佈並進行測試,完成之後再合併到develop分支上。

Git 教程之分支管理詳解_相關技巧_git_27

release分支
release分支作為預發佈分支,release 分支從 develop 分支 fork 出來,最終會合併到 develop 分支和 stable 分支,合併到 stable分支上就是可以發佈的代碼了。
為什麼我從develop分支fork出來,還要合併到develop分支中呢?因為大家在release分支上難免會有bug產生,修復bug也是在release分支上,所以必須要合併到develop分支。

Git 教程之分支管理詳解_相關技巧_git_28

bugfix分支
bugfix 分支用來修復線上bug。當線上代碼出現 bug 時,我們基於 stable 分支開一個bugfix分支,修復 bug之後再將 bugfix分支合併到stable分支並進行發佈,同時develop 分支作為最新最全的代碼分支,bugfix分支也需要合併到 develop 分支上去。