1、git操作說明
- 1、
commit
:對當(dāng)前操作目錄、資源文件、代碼等的一個快照 - 2、
diff
:commit與commit之間的差異 - 3、
branch
:分支--在一個commit之間進(jìn)行分開的時候 - 4、
merge
:合并--兩個commit合并到一起 -
repository
:倉庫--記錄上面四個操作的過程叫倉庫
Git與SVN的差別
svn存儲的是diff
,這就意味著我們在當(dāng)前commit
下,想要回到之前指定的某個commit
,只能一個一個進(jìn)行回撤
git存儲的是整個快照commit
,如果我們不對.git
文件進(jìn)行處理,會導(dǎo)致.git
文件越來越大
git工作流程
我們平時都是在workspace
工作區(qū)中,然后通過git add
提交到Index\Stage
索引區(qū)、暫存區(qū),再通過git commit
提交到Repository
倉庫,倉庫再通過git push
到遠(yuǎn)程倉庫,遠(yuǎn)程倉庫再通過pull
或者fetch/clone -- > checkout
到本地倉庫
git reset與git checkout命令
HEAD
HEAD
是用來指向分支的最后一次提交
git reset
:回退版本,可以指定退回到某次提交的版本
git reset --soft HEAD~1
:回退到上次提交的暫存區(qū),不會改變當(dāng)前工作區(qū)
git reset HEAD .
:移除當(dāng)前暫存區(qū)文件
git reset --hard HEAD~1
:回退到上次提交的工作目錄,會改變當(dāng)前工作區(qū)
git checkout master
:切換到master分支
git checkout -- .
:重新存儲工作區(qū)文件到暫存區(qū)
Git key-value?件系統(tǒng)
我們在使用Git時會發(fā)現(xiàn)無法提交空目錄,那是因?yàn)樵贕it中是沒有目錄的概念,只有文件,使用過保存路徑來對應(yīng)相應(yīng)的文件
如果我們想提交一個空目錄,那我們可以在目錄下創(chuàng)建.gitkeep
或者.keep
文件,然后在項(xiàng)目的.gitignore
中設(shè)置不忽略.gitkeep
我們在提交修改commit
的時候,git
會根據(jù)本次提交修改的文件的哈希值
為Key
,修改的文件的壓縮版本為Value
,通過樹結(jié)構(gòu)
來存儲提交
git hash-object
:計(jì)算文件的哈希值作為key
存到系統(tǒng)里,文件內(nèi)容作為value
存放到.git
目錄
git update-index
:將文件計(jì)算出來的哈希值存儲到暫存區(qū)
git write-tree
:將暫存區(qū)
的內(nèi)容生成樹結(jié)構(gòu)(本質(zhì)上也是個哈希值
),然后將樹結(jié)構(gòu)提交到commit tree
.git
目錄會存儲每次文件修改的壓縮版本和每次提交的commit
信息的壓縮版本
Git對象存儲
Git將存儲對象的40位HASH分為兩部分:
- 頭兩位作為?件夾
- 后38位作為對象?件名 .git/objects/hash[:2]/hash[2:40]
為什么要這么設(shè)計(jì)?錄結(jié)構(gòu),?不直接使?40位hash作為?件名?
- 部分?件系統(tǒng)對?錄下的?件數(shù)量有限制。例如,F(xiàn)AT32限制單?錄下的最??件數(shù)量是65535個。
- 部分?件系統(tǒng)查找?件屬于線性查找,?錄下的?件越多,訪問越慢。
git init
后的.git
文件目錄如下圖所示
git add .
后.git
文件目錄如下圖所示git cat-file -p
打印哈希值對應(yīng)的信息Git index?件
Git在 .git ?件夾下?存放了 index
?件,該?件表示Git stage
的內(nèi)
容。該?件是?進(jìn)制?件
,保存了被stage的?件的所有信息,像inode信息、hash值等等
hexdump
hexdump
命令查看index
文件二進(jìn)制數(shù)據(jù)信息
git ls-files -s
git ls-files -s
查看暫存區(qū)的文件具體信息
100644
對應(yīng)的是?個mode
值,代表普通?件
。在Git?,?個常?的mode值包括:
- 100644 - 普通?件;
- 100755 - 可執(zhí)??件;
- 120000 - 符號鏈接(symbolic link);
- 040000 - ?錄;
git hash-object
git hash-object
:計(jì)算?個?件的git對象ID,即SHA1的哈希值
git hash-object -w
:將指定對象(哈希值)寫?數(shù)據(jù)庫
當(dāng)文件內(nèi)容沒有改變,對應(yīng)的哈希值不會改變
git update-index
git update-index
:將?作?錄的?件加?索引/暫存區(qū)域
git write-tree
git write-tree
:生成文件樹,本質(zhì)也是個哈希值,也是存放在.git/objects
目錄下
git read-tree
git read-tree
:將給出的樹寫?索引但不寫?暫存
git commit-tree
git commit-tree
:將給出的樹提交到倉庫
遠(yuǎn)程倉庫
創(chuàng)建一個倉庫,就可以提交代碼到該倉庫
git init --bare
初始化git環(huán)境
git init
添加一個遠(yuǎn)程倉庫,可以添加多個remote
git remote add
拉取遠(yuǎn)程代碼合并到本地倉庫
git pull
提交本地代碼到遠(yuǎn)程倉庫
git push --set upstream origin master
當(dāng)遠(yuǎn)程的master沒有新的commit
的時候,會將新提交的commit放到master分支最后
,如果有新的commit會快速合并失敗報(bào)錯
git mergetool
打開圖形界面,解決合并沖突
git rebase
并不是創(chuàng)建一個新的commit,而是將指定的一個分支放到另一個分支的結(jié)尾
git rebase origin/master