Git 學習筆記整理

Git起步

Git是什麼?

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

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


image數據庫

Git幾個特性

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

    git會對當時的所有文件製做一個快照並保存這個快照的索引。git對待數據更像是一個 快照流segmentfault

  • 幾乎全部操做都是本地執行
  • 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是一個內容尋址文件系統,它的核心部分是一個簡單的鍵值對數據庫。post

數據對象(blob object)

是一塊二進制數據,沒有其餘任何指向或任何屬性,甚至連文件名都沒有。測試

git會根據文件內容計算出一個hash值,以hash值做爲文件索引存儲在Git文件系統中spa

樹對象(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經常使用命令

百度雲 密碼:7ze2
圖片描述

Git提交規範

  • git commit

    • feat:新功能(feature)
    • fix:修補bug
    • docs:文檔(documentation)
    • style: 格式(不影響代碼運行的變更)
    • refactor:重構(即不是新增功能,也不是修改bug的代碼變更)
    • test:增長測試
    • chore:構建過程或輔助工具的變更
相關文章
相關標籤/搜索