2018-07-12

內(nèi)容

  • 基本原理
  • git 常用命令
  • 較底層的原理

基本原理

Git 實(shí)際上是一個(gè)內(nèi)容尋址系統(tǒng)淑蔚。

Git 中保存的所有數(shù)據(jù)必尼,包括:文件內(nèi)容屈尼、提交信息、項(xiàng)目快照等數(shù)據(jù)都會(huì)被轉(zhuǎn)換為二進(jìn)制文件并壓縮后存放在 .git 中的 objects 文件夾中艺挪。

Git 在轉(zhuǎn)換并壓縮這些數(shù)據(jù)的同時(shí)不翩,會(huì)以特定的算法(SHA-1)生成每個(gè)數(shù)據(jù)對(duì)應(yīng)的由40個(gè)的十六進(jìn)制字符(0-9 和 a-f)組成的字符串,一般可以稱之為hash(哈希)麻裳。

這個(gè)hash的特點(diǎn)是:

  1. 該hash根據(jù)文件的類型和內(nèi)容生成
  2. hash值相同,則文件內(nèi)容相同

Git 倉(cāng)庫(kù)中的文件類型有四種:blob器钟、commit津坑、treetag傲霸,先不講 tag類型疆瑰。

blob 類型文件用來存放項(xiàng)目文件的內(nèi)容,但是不包括文件的路徑昙啄、名字穆役、格式等其它描述信息。項(xiàng)目的任意文件的任意版本都是以blob的形式存放的梳凛。比如 Git 倉(cāng)庫(kù)中有一個(gè) README.MD文件耿币,里面有一句文字為"hello world",則在 .objects文件夾中一定會(huì)有一個(gè)類型為 blob 的文件韧拒,其中的二進(jìn)制數(shù)據(jù)經(jīng)過轉(zhuǎn)換后的值為"hello world"淹接。

commit 類型文件存放項(xiàng)目的提交對(duì)象信息十性。其中的 parent 字段指向其父提交,tree字段指向項(xiàng)目的快照塑悼,還有一些提交信息劲适,比如作者姓名啥的。

tree 類型文件存放了整個(gè)項(xiàng)目的結(jié)構(gòu)厢蒜,用來表示項(xiàng)目的目錄情況霞势。因?yàn)轫?xiàng)目其實(shí)就是一個(gè)目錄,目錄中有文件斑鸦、有子目錄愕贡。因此 tree 中有 blob子tree鄙才,且都是使用 sha-1值引用的颂鸿。這是與目錄對(duì)應(yīng)的。從頂層的 tree 縱覽整個(gè)樹狀的結(jié)構(gòu)攒庵,葉子結(jié)點(diǎn)就是 blob 嘴纺,表示文件的內(nèi)容,非葉子結(jié)點(diǎn)表示項(xiàng)目的目錄浓冒,頂層的 tree 對(duì)象就代表了當(dāng)前項(xiàng)目的快照栽渴。

Git 將生成的hash作為所有數(shù)據(jù)的索引。包括提交對(duì)象稳懒、文件內(nèi)容闲擦、項(xiàng)目快照全部通過hash索引位置。

因此我們很容易聯(lián)想到场梆,其實(shí)分支就是指向某個(gè)提交對(duì)象的hash值墅冷,只是我們給予了其一個(gè)別名。

兩個(gè)狀態(tài)和三個(gè)狀態(tài)

兩個(gè)狀態(tài)

已追蹤或油,未追蹤

三個(gè)狀態(tài)

處于 已追蹤 狀態(tài)下的文件會(huì)被納入 Git 倉(cāng)庫(kù)進(jìn)行管理寞忿,這時(shí)其擁有了已修改已暫存顶岸,已提交 三個(gè)狀態(tài)腔彰。

根據(jù)上面的三個(gè)狀態(tài),我們有了三個(gè)工作區(qū)域的概念:工作目錄辖佣、暫存區(qū)域霹抛、以及Git 倉(cāng)庫(kù)。

工作目錄卷谈、暫存區(qū)域以及 Git 倉(cāng)庫(kù).

基本的 Git 工作流程如下:

  1. 在工作目錄中修改文件杯拐。
  2. 暫存文件,將文件的快照放入暫存區(qū)域。
  3. 提交更新藕施,找到暫存區(qū)域的文件寇损,將快照永久性存儲(chǔ)到 Git 倉(cāng)庫(kù)目錄。

基于上面的概念裳食,Git 文件的狀態(tài)變化周期如下圖:

文件的狀態(tài)變化周期

git 常用命令

git clone [url] - 克隆項(xiàng)目

git add [file name] - 提交指定文件或標(biāo)記文件已合并成功或追蹤指定文件

git add . - 提交處于已修改狀態(tài)的所有文件或標(biāo)記合并成功或追蹤所有未被追蹤的文件(文件不在.gitignore中)

git commit - 打開編輯器進(jìn)行提交操作

git commit -a - 跳過暫存直接將已修改的文件提交

git commit -m [commit info] 當(dāng)行提交命令進(jìn)行提交

git commit --amend - 撤銷最后一次提交

git reset --hard [commit hash] - 以最后一次提交的數(shù)據(jù)為基礎(chǔ)矛市,撤銷暫存區(qū),工作目錄中的所有更新

git reset [file name] - 將指定文件從暫存區(qū)撤銷

git push - 將提交推送到與本地分支建立了追蹤關(guān)系的遠(yuǎn)程分支

git pull - 拉取與本地分支建立了追蹤關(guān)系的遠(yuǎn)程分支上的最新提交并與本地分支進(jìn)行合并

git fetch - 同 git pull ,但是不會(huì)主動(dòng)合并

git diff - 查看工作目錄中文件的變化

git diff --cached \ git diff --staged - 查看已經(jīng)暫存的文件相對(duì)于最后一次提交的變化

git branch -vv - 顯示本地分支和遠(yuǎn)程分支的追蹤關(guān)系

git branch -d [branch] - 刪除本地分支

git branch --merged - 顯示已與當(dāng)前分支進(jìn)行了合并的分支

git branch --no-merged - 顯示還未與當(dāng)前分支合并的分支

git merge [branch] - 將指定的分支合并到當(dāng)前分支

git rebase [base branch] [topic branch] - 將指定分支[topic branch]變基到當(dāng)前分支[base branch]

git stash - 將當(dāng)前還未提交的更新儲(chǔ)藏到棧中

git stash apply [stash name] - 應(yīng)用指定的儲(chǔ)藏到當(dāng)前項(xiàng)目中

git stash drop [stash name] - 刪除指定儲(chǔ)藏

git stash pop - 將最后儲(chǔ)藏的更新信息應(yīng)用到當(dāng)前工作目錄中并刪除該儲(chǔ)藏

git log - 查看提交記錄

git log -p - 查看提交記錄的詳細(xì)信息诲祸,類似于 git diff

git log --stat - 查看提交較詳細(xì)的信息

Git 常用命令

較底層的原理

分支關(guān)系

參考文章

  1. 使用原理視角看 Git
  2. 深入淺出 Git
  3. [譯] 關(guān)于 Git 你需要知道的一些事情
  4. 為什么你的 Git 倉(cāng)庫(kù)變得如此臃腫
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末浊吏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子救氯,更是在濱河造成了極大的恐慌找田,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件着憨,死亡現(xiàn)場(chǎng)離奇詭異墩衙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)甲抖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門漆改,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人准谚,你說我怎么就攤上這事挫剑。” “怎么了柱衔?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵樊破,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我唆铐,道長(zhǎng)哲戚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任艾岂,我火速辦了婚禮惫恼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘澳盐。我一直安慰自己,他們只是感情好令宿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布叼耙。 她就那樣靜靜地躺著,像睡著了一般粒没。 火紅的嫁衣襯著肌膚如雪筛婉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音爽撒,去河邊找鬼入蛆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛硕勿,可吹牛的內(nèi)容都是我干的哨毁。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼源武,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼扼褪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粱栖,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤话浇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后闹究,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幔崖,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年渣淤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赏寇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡砂代,死狀恐怖蹋订,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刻伊,我是刑警寧澤露戒,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站捶箱,受9級(jí)特大地震影響智什,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丁屎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一荠锭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晨川,春花似錦证九、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至妈拌,卻和暖如春拥坛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工猜惋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丸氛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓著摔,卻偏偏與公主長(zhǎng)得像缓窜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子梨撞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 一顆葡萄有多甜美 用盡了所有的圖騰和語言 描寫 想一個(gè)人有多想念 那又是文字失效瞬間 結(jié)一個(gè)紀(jì)念的繩結(jié) 記錄你離去...
    魚魚魚余十二閱讀 855評(píng)論 0 0
  • 雨敲打窗欞雹洗,敲打四月的清涼,遮掩夜的恓惶卧波。望著窗外的迷蒙时肿,和著雨的節(jié)拍,心跟著攪動(dòng)港粱,跟著喧嘩螃成。 抒情的季節(jié),萬物膨...
    雪琴吟閱讀 688評(píng)論 0 5
  • 現(xiàn)在很多人不滿足于現(xiàn)狀查坪,但是又不敢辭職寸宏,自己創(chuàng)業(yè),去開拓屬于自己的一片天空偿曙,我現(xiàn)在想說的就是相信自己氮凝,放心去辭職,...
    帥帥的小師哥閱讀 239評(píng)論 1 1
  • 很多年輕人有痛苦望忆,但我覺得我已經(jīng)沒有罩阵。只是情緒,偶爾還會(huì)很幼稚的跑出來启摄,攪擾我并告訴我依然活在人群稿壁。我沒有話可以說...
    木米2018閱讀 170評(píng)論 0 0
  • 作為本科學(xué)心理學(xué)專業(yè)的我來說,“專業(yè)病”就是習(xí)慣分類歉备,其實(shí)傅是,面對(duì)成長(zhǎng),面對(duì)不確定的情境蕾羊,大體上可以分為兩類人喧笔。一類...
    招財(cái)貓cx閱讀 348評(píng)論 0 0