Git是一個免費的開源分佈式版本控制系統,旨在快速,高效地處理從小型到大型項目的全部事務。
git
集中式與分佈式的區別:
數據庫
git會對當時的所有文件製做一個快照並保存這個快照的索引。git對待數據更像是一個 快照流segmentfault
git中全部數據存儲前都計算校驗和,而後用校驗和來引用。git用以計算校驗和的機制叫作SHA-1 hash。是一個由40個十六進制字符組成的字符串。實際上,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是一個內容尋址文件系統,它的核心部分是一個簡單的鍵值對數據庫。post
是一塊二進制數據,沒有其餘任何指向或任何屬性,甚至連文件名都沒有。測試
git會根據文件內容計算出一個hash值,以hash值做爲文件索引存儲在Git文件系統中spa
提交對象是用來保存提交的做者、時間、說明這些信息的,commit-tree除了要指定提交的樹對象,也要提供提交說明,至於提交的做者和時間,則是根據環境變量自動生成,並不須要指定。
咱們運行 git add 和 git commit 命令時, Git 所作的實質工做——將被改寫的文件保存爲數據對象,更新暫存區,記錄樹對象,最後建立一個指明瞭頂層樹對象和父提交的提交對象。這三種主要的 Git 對象——數據對象、樹對象、提交對象——最初均以單獨文件的形式保存在 .git/objects 目錄下。
咱們能夠藉助相似於git log 1a410e 這樣的命令來瀏覽完整的提交歷史,但爲了能遍歷那段歷史從而找到全部相關對象,你仍須記住 1a410e 是最後一個提交。咱們須要一個文件來保存 SHA-1 值,並給文件起一個簡單的名字,而後用這個名字指針來替代原始的 SHA-1 值。
在 Git 裏,這樣的文件被稱爲 引用(references,或縮寫爲 refs)。你能夠在 .git/refs 目錄下找到這類含有 SHA-1 值的文件。
附上感受講的不錯的一篇文章
回滾的選擇
git reset [type] HEAD
git reset用於撤銷未被提交到remote的改動,即撤銷local的修改。除了移動當前分支的HEAD(提交記錄),還能夠更改workspace(工做目錄)和index(暫存區):
git revert
經過新建一個commit來撤銷一次commit所作的修改,是一種安全的方式,並無修改commit history
總結:
命令 | 做用域 | 經常使用場景 |
---|---|---|
git reset | 提交層面 | 在私有分支上舍棄一些沒有提交的更改 |
git reset | 文件層面 | 將文件從緩存區中移除 |
git checkout | 提交層面 | 切換分支或查看舊版本 |
git checkout | 文件層面 | 捨棄工做目錄中的更改 |
git revert | 提交層面 | 在公共分支上回滾更改 |
git revert | 文件層面 |
也就是咱們常常使用的Master分支,這個分支最近發佈到生產環境的代碼,最近發佈的Release, 這個分支只能從其餘分支合併,不能在這個分支直接修改
這個分支是咱們是咱們的主開發分支,包含全部要發佈到下一個Release的代碼,這個主要合併與其餘分支,好比Feature分支
這個分支主要是用來開發一個新的功能,一旦開發完成,咱們合併回Develop分支進入下一個Release
當你須要一個發佈一個新Release的時候,咱們基於Develop分支建立一個Release分支,完成Release後,咱們合併到Master和Develop分支
當咱們在Production發現新的Bug時候,咱們須要建立一個Hotfix, 完成Hotfix後,咱們合併回Master和Develop分支,因此Hotfix的改動會進入下一個Release
圖解:
百度雲 密碼:7ze2
git commit