github 進階說明

github 進階說明

前言

咱們能夠什麼都無論,照搬命令來完成咱們大部分git工做,可是若是想要進一步,就要深刻理解git的實現原理,和底層機制。github

三個目錄樹

  1. HEAD 倉庫指針
  2. index file 暫存區
  3. Working Directory 工做目錄

默認狀況,頭指針會指向當前分支,當前分支指向當前目錄樹。所謂目錄樹簡而言之就是一個commit對象,保存了某個提交時刻的工做目錄內容的鏡像。而工做目錄就是當前文件內容。bash

狀態一:初始狀況是三者相同。
狀態二:當你編輯了工做目錄下的內容,工做目錄和暫存區就不一樣。git status會提示你git add相關文件。
狀態三:git add 以後,暫存區和倉庫又不相同了,git status 提示你git commit,當你git commit以後,回到狀態一,倉庫就增長了一個新的版本,當前分支指針移動到新版本之上。服務器

周而復始。ui

重置 git reset

但總有須要重置的時候:指針

git reset移動當前分支指針(即間接改變HEAD)。code

手段一:git reset --soft HEAD~移動HEAD指針到HEAD~,這時倉庫和暫存區不一樣,暫存區和工做目錄相同,即狀態三。簡而言之,就是「撤銷」了上次的提交。對象

手段二:git reset --mixed HEAD~ 移動HEAD指針到HEAD~,並重置暫存區。這時倉庫和暫存區相同,工做區和暫存區不一樣,即進入狀態二。--mixed是默認參數。索引

手段三:git reset --hard HEAD~ 移動HEAD指針到HEAD~,並重置暫存區和工做區到當前HEAD版本。即狀態一。這是一條危險操做,由於你可能會丟失當前正在編輯而沒提交的全部內容。但這條命令也是真正徹底的實現了跳躍版本,不會殘留任何一點當前版本的信息。ip

增長路徑的reset

reset能夠增長路徑,這時的表現就是重置某個文件而已。並不會改動HEAD指針

git reset -- file.txt 重置暫存區file.txt文件狀態。簡而言之,就是git add的反向操做。

你還能指定暫存區重置到哪一個版本git reset 234b file.txt

檢出 checkout

checkout和reset命令很類似,也是操控三個目錄樹。差異是checkout 改變HEAD自己,reset是改變當前被HEAD指向的分支。務必理解這個二重指針的結構。

好比HEAD 指向master,reset 會改變master,HEAD不變。而checkout 會直接改變HEAD,master不變。雖然表面現象上來講不少時候表現是差很少的,由於當前用戶可能只會觀察到三棵樹的變化,而沒有留意指針的變化。

git checkout develop 從master分支切換到develop分支,並重置工做區和暫存區,進入狀態一。

帶路徑的checkout

相似帶路徑的reset,並不會改變HEAD,不一樣點它重置暫存區,同時也重置工做區。

git checkout -- file.txt 用當前HEAD指向的目錄樹中的file.txt鏡像重置暫存區和工做區。

倉庫

  1. 純倉庫。git init --bare 建立一個純倉庫,只是用來存儲倉庫數據而不是用來工做的。好比用來作服務器遠端倉庫,本地倉庫的備份。
  2. 空倉庫。git init 建立一個空倉庫

倉庫內容:ls -F1 .git

branches/      #分支
COMMIT_EDITMSG
COMMIT_EDITMSG.save
config      #設置
description  #GitWeb使用
FETCH_HEAD
gitk.cache
HEAD #頭指針
hooks/ #鉤子
index #暫存區
info/ #全局排除模式,相似.gitignore
logs/
objects/ #數據
ORIG_HEAD
refs/ #各類commit 指針

數據對象

  1. git hash-object 任何對象均可以用哈希值加入倉庫索引
  2. git cat-file 用哈希值搜索倉庫內對象
  3. git update-index --add --cachinfo 100644 更新暫存區對象
  4. git write-tree 將暫存區寫入樹對象
  5. git read-tree --prefix=dir 加入子樹,前綴dir
  6. git commit-tree c03ca4 用樹對象生成提交對象
  7. git log --stat 查看提交對象歷史信息
  8. git fsck --full 查看沒有引用的對象
  9. git gc 壓縮對象庫
  10. git count-objects -v 查看空間暫用統計
  11. git prune --expire now 當即清除全部不被引用的對象(由於試驗,生成了錯誤的對象,可是要清理很是很是麻煩,最後靠這條命令成功清理了)
  12. git reflog expire --expire-unreachable=0 --all 清理操做記錄,這是對象有可能被引用的地方

其餘

  1. git config core.autocrlf true 自動轉換換行格式。

資料

git社區參考書:http://gitbook.liuhui998.com/

相關文章
相關標籤/搜索