一、git基本原理與概念:
一個git倉庫,可以被分爲3個區域,分別是工作區,暫存區,版本庫。
當一個文件,在git版本庫中,會有三種狀態:
modified(已修改) 當git工作區中新增了文件,或者原有文件被修改,沒被提交到暫存區時,就是modified狀態。
staged(已暫存) 當文件被被添加到暫存區後,就爲staged狀態。
committed(已提交) 文件從暫存區提交到版本庫時的狀態。
在工作區的文件會有兩種狀態:
untracked 未被版本庫追蹤。(比如說,在版本庫的工作區目錄裏新增了一個文件,這個文件從來沒有被增加到暫存區以及提交,那這個文件在工作區就是untracked狀態)
tracked 版本庫追蹤狀態,(已經提交過版本庫,被版本庫追蹤的文件)
二、常用操作。
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對象文件類型。
三、git版本庫目錄介紹
branches 項目分支信息。
hooks hooks腳本,特定事件觸發。
info 裏面有一個exclude 文件,這個文件用來指定忽略工作區的指定文件或者目錄。
log 記錄了歷史commit記錄或者刪除記錄。
objects 這裏面真正的保存了修改的內容,以及commit,tree,blob,tag這四個對象。
refs 引用指針,用於指向本地(或遠程)分支或tag的指針。
config 當前git項目的配置信息
HEAD 用於指向分支的最末端(最後一次提交)。
index 暫存區文件。
COMMIT_EDITNSG 最後一次提交的註釋信息。
description git 項目描述信息。
四、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 可以查看標籤內容。
五、常用操作詳解。
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]
================================