git相關整理
一、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 #增加
----------------------------------未完待續