內(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)是:
- 該hash根據(jù)文件的類型和內(nèi)容生成
- hash值相同,則文件內(nèi)容相同
Git 倉(cāng)庫(kù)中的文件類型有四種:blob
器钟、commit
津坑、tree
、tag
傲霸,先不講 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ù)。
基本的 Git 工作流程如下:
- 在工作目錄中修改文件杯拐。
- 暫存文件,將文件的快照放入暫存區(qū)域。
- 提交更新藕施,找到暫存區(qū)域的文件寇损,將快照永久性存儲(chǔ)到 Git 倉(cāng)庫(kù)目錄。
基于上面的概念裳食,Git 文件的狀態(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ì)的信息