1、git基本原理與概念:git
一個git倉庫,能夠被分爲3個區域,分別是工做區,暫存區,版本庫。ide
當一個文件,在git版本庫中,會有三種狀態:
ui
modified(已修改) 當git工做區中新增了文件,或者原有文件被修改,沒被提交到暫存區時,就是modified狀態。spa
staged(已暫存) 當文件被被添加到暫存區後,就爲staged狀態。指針
committed(已提交) 文件從暫存區提交到版本庫時的狀態。對象
在工做區的文件會有兩種狀態:事件
untracked 未被版本庫追蹤。(好比說,在版本庫的工做區目錄裏新增了一個文件,這個文件歷來沒有被增長到暫存區以及提交,那這個文件在工做區就是untracked狀態)ip
tracked 版本庫追蹤狀態,(已經提交過版本庫,被版本庫追蹤的文件)it
2、經常使用操做。io
git init #初始化一個git倉庫。
git config --gloabl user.name "shz" #配置代碼提交人姓名
git config --global user.emall "shz.qq.com" #代碼提交人郵箱
git config --global color.ui true #顯示顏色差別。(不一樣的狀態會有顏色差別)
配置參數以及配置文件位置:
--global : 當前用戶全局配置文件 ~/.gitconfig
--system: 修改全部用戶的配置文件:/etc/gitconfig
修改當前版本倉庫的配置文件 .git/config
git add [xxx] #將文件添加到暫存區。
git commit ["text"] #將暫存區的文件提交到版本庫。
git log #查看提交歷史
git status # 查看當前git倉庫中文件的狀態。
git diff #能夠查看一個文件在工做區和暫存區的差別。
git show [SHA1] #查看一個具體的提交。
git clone #克隆一個遠程倉庫。
分支操做:
git branch [xxx] 建立一個新的分支。
git checkout [xxx] 切換到指定分支。
git tag [v1.0] 添加一個標籤。
其餘操做:
git show [SHA1] #能夠看指定的某次提交對文件做出的修改(其實就是查看blob文件的內容。)
git cat-file -p [filename] #查看git對象文件內容。
git cat-file -t [filename] #查看git對象文件類型。
3、git版本庫目錄介紹
branches 項目分支信息。
hooks hooks腳本,特定事件觸發。
info 裏面有一個exclude 文件,這個文件用來指定忽略工做區的指定文件或者目錄。
log 記錄了歷史commit記錄或者刪除記錄。
objects 這裏面真正的保存了修改的內容,以及commit,tree,blob,tag這四個對象。
refs 引用指針,用於指向本地(或遠程)分支或tag的指針。
config 當前git項目的配置信息
HEAD 用於指向分支的最末端(最後一次提交)。
index 暫存區文件。
COMMIT_EDITNSG 最後一次提交的註釋信息。
description git 項目描述信息。
4、git對象介紹:
git內部有四種數據對象類型,分別是blob,tree,commit,tag。
blob:用來存儲文件的數據。
經過git show commit提交的哈希值 就能夠看到blob對象內部的內容了。
例如:git show 0ba6f2a65f03788ac52e31aa7b2eb95731dc7437 就能夠看到此次commit都作了哪些修改。
tree: 像一個目錄樹結構,用來管理其餘tree和blob
tree維護的就是一個git倉庫中的目錄樹結構,裏面具體指向了哪一個tree或者哪一個blob 能夠經過 git cat-file來查看。
commit:指向一個tree,用來標記某個目錄文件某個時間點特定的狀態。(每次提交代碼到本地的版本庫git commit後就會產生一個commit對象。)
commit對象主要有如下幾個部分構成:
1.一個tree對象
2.父對象
3.做者
4.日期
5.提交者
爲何要有父對象?
父對象指向了上一次提交的操做,當每次修改而後提交,commit對象自己並不會存儲修改的內容,文件修改的內容都是經過和父對象的比較而來的。
tag: 用來指向一個commit。
其實git的分支,標籤都是對commit對象作了一個指針,這個指針的存放路徑在.git/refs下。
聽說git內部有兩種tag,一種就是commit指針,另一種tag是個完整的tag對象。
tag對象組成:
對象名,標籤名,對象類型,標籤建立這者名字。
tag標記會指向一個commit的SHA1.
tag標籤與分支的最大區別是?
tag標籤與分支雖然都指向一個commit,可是tag標籤是一個常量指針,是不能改變的。
而分支確是一個變量指針。
git cat-file -p 能夠查看標籤內容。
5、經常使用操做詳解。
1.將文件添加進暫存區。
git add [文件名] #將一個文件添加進暫存區。
git add . #一次性添加當前工做區中全部的文件到暫存區。
#這一步操做能夠將git倉庫未追蹤的文件加入到git倉庫的追蹤範圍,若是文件已被git倉庫追蹤,那麼就會將本次修改添加到暫存區中。
2.將暫存區的文件提交到本地代碼庫。
git commit -m "commit info" #單步提交,只執行將暫存區文件提交到版本庫的操做。
git commit -a #一次性提交,將add到暫存區的操做也一併作了。(這種提交方式生產環境不推薦。)
git commit --amend #修改最後一次提交。
3.文件刪除。
#同時將某文件從工做目錄和暫存區刪除:
git rm -f [filename]
# 若是經過rm命令直接進行刪除,而後再commit提交,雖然git不會再追蹤這個文件,可是,裏面還會保存有已刪除文件的快照。
#從暫存區中刪除,在工做目錄中保留.
git rm --cached [xxx]
#從版本庫中刪除,版本回退到錯誤提交以前。
#將錯誤提交到版本庫的數據回退到暫存區。
git reset -soft [SHA1]
#將錯誤的提交從暫存區回退到工做區。
git reset -mixed [SHA1]
#將工做區,暫存區,版本庫恢復到指定版本。
git reset --hard SHA1
4.重命名。
git mv [old_file] [new_file]
實際操做:
mv [oldfile] [newfile] 首先文件重命名。
git rm old_file #刪除
git add new_file #增長
5.撤銷修改。
撤銷對工做區的修改:
git checkout [filename] #讓工做區中的文件回到最近一次commit 或者 add 的狀態。
#若文件還沒添加到暫存區時,執行這條撤銷語句,會變的和版本庫中記錄的同樣。
#若文件已添加到暫存區並作了修改,則會回到暫存區的狀態!
撤銷對暫存區的修改:
git reset HEAD [filename] #將添加到暫存區的修改回退到工做區。
撤銷對版本庫的提交:
git reset --hard [sha1]
6.差別比較。
比較工做區和暫存區的差別。
git diff #查看還沒有加入到暫存區的文件有哪些新的修改。
查看暫存區和版本庫的差別。
git diff --cached #默認參數是HEAD 就是和版本庫中最後一次commit作比較。
git diff --staged 【SHA1】 #和版本庫中的某個commit進行比較。
查看工做區和版本庫的差別。
git diff HEAD【SHA1】
比較兩個版本提交之間的差別。
git diff 【SHA1】[SHA2]
================================