Git & Git Flow
Git起步
Git是什麼?
Git是一個免費的開源 分散式版本控制系統 ,旨在快速,高效地處理從小型到大型專案的所有事務。
集中式與分散式的區別:
Git幾個特性
- 直接記錄快照,而非差異比較
git會對當時的全部檔案製作一個快照並儲存這個快照的索引。git對待資料更像是一個 快照流
- 幾乎所有操作都是本地執行
- Git保證完整性
git中所有資料儲存前都計算校驗和,然後用校驗和來引用。git用以計算校驗和的機制叫做SHA-1 hash。是一個由40個十六進位制字元組成的字串。實際上,git資料庫中儲存的資訊都是以檔案內容的雜湊值來索引,而非檔名。
- Git一般只新增資料
三種狀態
git有三種狀態:已提交(資料已經儲存在本地倉庫中)、已修改(已修改檔案,但是還未儲存到倉庫中)、已暫存(對一個已修改檔案的當前版本做了標記,使之包含在下次提交的快照中)。
由此引出三個工作區域的概念:Git倉庫、工作目錄、暫存區域。
Git內部原理
首先我們來看一個新的 .git 目錄的結構
HEAD config* description hooks/ info/ objects/ refs/
description檔案僅供GitWeb程式使用,我們無需關心。
config檔案包含專案特有的配置選項。
info目錄包含一個全域性性排除(global exclude)檔案,用以放置那些不希望被記錄在.gitignore 檔案中的忽略模式(ignored patterns)。
hooks目錄包含客戶端或服務端的鉤子指令碼(hook scripts)。
剩下的四個條目很重要:
HEAD檔案、(尚待建立的) index檔案 ,和 objects目錄 、 refs目錄 。 這些條目是 Git 的核心組成部分。
objects目錄儲存所有資料內容;refs目錄儲存指向資料(分支)的提交物件的指標;HEAD檔案指示目前被檢出的分支;index 檔案儲存暫存區資訊。
Git物件
Git是一個內容定址檔案系統,它的核心部分是一個簡單的鍵值對資料庫。
資料物件(blob object)
是一塊二進位制資料,沒有其他任何指向或任何屬性,甚至連檔名都沒有。
git會根據檔案內容計算出一個hash值,以hash值作為檔案索引儲存在Git檔案系統中
樹物件(tree object)
提交物件(commit object)
提交物件是用來儲存提交的作者、時間、說明這些資訊的,commit-tree除了要指定提交的樹物件,也要提供提交說明,至於提交的作者和時間,則是根據環境變數自動生成,並不需要指定。
我們執行 git add 和 git commit 命令時, Git 所做的實質工作——將被改寫的檔案儲存為資料物件,更新暫存區,記錄樹物件,最後建立一個指明瞭頂層樹物件和父提交的提交物件。這三種主要的 Git 物件——資料物件、樹物件、提交物件——最初均以單獨檔案的形式儲存在 .git/objects 目錄下。
Git引用
我們可以藉助類似於git log 1a410e 這樣的命令來瀏覽完整的提交歷史,但為了能遍歷那段歷史從而找到所有相關物件,你仍須記住 1a410e 是最後一個提交。我們需要一個檔案來儲存 SHA-1 值,並給檔案起一個簡單的名字,然後用這個名字指標來替代原始的 SHA-1 值。
在 Git 裡,這樣的檔案被稱為 引用(references,或縮寫為 refs)。你可以在 .git/refs 目錄下找到這類含有 SHA-1 值的檔案。
程式碼回滾的選擇
git reset、git checkout、git revert的選擇
附上感覺講的不錯的一篇文章
ofollow,noindex" target="_blank">回滾的選擇git reset [type] HEAD
git reset用於撤銷未被提交到remote的改動,即撤銷local的修改。除了移動當前分支的 HEAD (提交記錄),還可以更改 workspace (工作目錄)和 index (暫存區):
- --soft:修改HEAD,不修改index和workspace。
- --mixed:修改HEAD和index,不修改workspace。預設行為。
- --hard:修改HEAD、index、workspace。
git revert
通過新建一個commit來撤銷一次commit所做的修改,是一種安全的方式,並沒有修改commit history
總結:
命令 | 作用域 | 常用場景 |
---|---|---|
git reset | 提交層面 | 在私有分支上舍棄一些沒有提交的更改 |
git reset | 檔案層面 | 將檔案從快取區中移除 |
git checkout | 提交層面 | 切換分支或檢視舊版本 |
git checkout | 檔案層面 | 捨棄工作目錄中的更改 |
git revert | 提交層面 | 在公共分支上回滾更改 |
git revert | 檔案層面 |
Git Flow
Git Flow常用的分支
- Production 分支
也就是我們經常使用的Master分支,這個分支最近釋出到生產環境的程式碼,最近釋出的Release, 這個分支只能從其他分支合併,不能在這個分支直接修改
- Develop 分支
這個分支是我們是我們的主開發分支,包含所有要釋出到下一個Release的程式碼,這個主要合併與其他分支,比如Feature分支
- Feature 分支
這個分支主要是用來開發一個新的功能,一旦開發完成,我們合併回Develop分支進入下一個Release
- Release分支
當你需要一個釋出一個新Release的時候,我們基於Develop分支建立一個Release分支,完成Release後,我們合併到Master和Develop分支
- Hotfix分支
當我們在Production發現新的Bug時候,我們需要建立一個Hotfix, 完成Hotfix後,我們合併回Master和Develop分支,所以Hotfix的改動會進入下一個Release
圖解:
附錄
Git常用命令
Git提交規範
-
git commit
- feat:新功能(feature)
- fix:修補bug
- docs:文件(documentation)
- style: 格式(不影響程式碼執行的變動)
- refactor:重構(即不是新增功能,也不是修改bug的程式碼變動)
- test:增加測試
- chore:構建過程或輔助工具的變動