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的選擇
附上感覺講的不錯的一篇文章
回滾的選擇
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:構建過程或輔助工具的變動