Git & Git Flow

Git起步

Git是什麼?

Git是一個免費的開源分佈式版本控制系統,旨在快速,高效地處理從小型到大型項目的所有事務。

集中式與分佈式的區別:
image


image

Git幾個特性

  • 直接記錄快照,而非差異比較

    git會對當時的全部文件製作一個快照並保存這個快照的索引。git對待數據更像是一個 快照流

  • 幾乎所有操作都是本地執行
  • Git保證完整性

    git中所有數據存儲前都計算校驗和,然後用校驗和來引用。git用以計算校驗和的機制叫做SHA-1 hash。是一個由40個十六進制字符組成的字符串。實際上,git數據庫中保存的信息都是以文件內容的哈希值來索引,而非文件名。

  • Git一般只添加數據

三種狀態

git有三種狀態:已提交(數據已經保存在本地倉庫中)、已修改(已修改文件,但是還未保存到倉庫中)、已暫存(對一個已修改文件的當前版本做了標記,使之包含在下次提交的快照中)。

由此引出三個工作區域的概念:Git倉庫、工作目錄、暫存區域。
image

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)

image

提交對象(commit object)

提交對象是用來保存提交的作者、時間、說明這些信息的,commit-tree除了要指定提交的樹對象,也要提供提交說明,至於提交的作者和時間,則是根據環境變量自動生成,並不需要指定。

我們運行 git add 和 git commit 命令時, Git 所做的實質工作——將被改寫的文件保存爲數據對象,更新暫存區,記錄樹對象,最後創建一個指明瞭頂層樹對象和父提交的提交對象。這三種主要的 Git 對象——數據對象、樹對象、提交對象——最初均以單獨文件的形式保存在 .git/objects 目錄下。

image

Git引用

我們可以藉助類似於git log 1a410e 這樣的命令來瀏覽完整的提交歷史,但爲了能遍歷那段歷史從而找到所有相關對象,你仍須記住 1a410e 是最後一個提交。我們需要一個文件來保存 SHA-1 值,並給文件起一個簡單的名字,然後用這個名字指針來替代原始的 SHA-1 值。

在 Git 裏,這樣的文件被稱爲 引用(references,或縮寫爲 refs)。你可以在 .git/refs 目錄下找到這類含有 SHA-1 值的文件。
image

代碼回滾的選擇

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介紹

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

圖解:
image

附錄

Git常用命令

image

Git提交規範

  • git commit

    • feat:新功能(feature)
    • fix:修補bug
    • docs:文檔(documentation)
    • style: 格式(不影響代碼運行的變動)
    • refactor:重構(即不是新增功能,也不是修改bug的代碼變動)
    • test:增加測試
    • chore:構建過程或輔助工具的變動
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章