Git 知識點
[TOC]
1.CentOS安裝Git
1.1 YUM源或者第三方源IUS源安裝
# 解除安裝自帶Git
yum remove -y git
yum install -y epel-release
# centos6配置IUS源
rpm -ivh https://centos6.iuscommunity.org/ius-release.rpm
# centos7配置IUS源
rpm -ivh https://centos7.iuscommunity.org/ius-release.rpm
yum list git2u
yum install -y git2u
git --version
# windows版本更新到最新版本
git update-git-for-windows
1.2 CentOS安裝最新版Git(源碼安裝)
# 安裝第三方依賴
sudo yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel
# 為了能夠添加更多格式的文檔(如 doc, html, info),你需要安裝以下的依賴包
sudo yum install -y asciidoc xmlto docbook2X
# 如果使用的是 Fedora/RHEL/RHEL-衍生 系統,需要執行
sudo ln -s /usr/bin/db2x_docbook2texi /usr/bin/docbook2x-texi
# 下載下傳源碼,解壓後編譯安裝
wget https://codeload.github.com/git/git/tar.gz/v2.18.0
tar zxvf git-2.18.0.tar.gz && cd git-2.18.0
sudo make configure
./configure --prefix=/usr
sudo make all doc info && sudo make install install-doc install-html install-info
# 現在已經可以用git指令了,用git把Git項目倉庫克隆到本地,以便日後随時更新
git clone git://git.kernel.org/pub/scm/git/git.git
1.3 配置全局使用者名和郵箱
git config --global user.name "顧小兔"
git config --global user.email [email protected]
1.4 安裝中文漢化包
Windows下Git漢化包下載下傳下載下傳後解壓到/mingw64/share即可,同時Git Bash設定如下:
顯示效果:
2. Git指令
2.1 git常用指令
# 初始化Git本地倉庫
git init
# 檢視Git項目狀态(工作區、暫存區)
git status
# 檢視Git項目日志記錄(本地倉庫,--oneline:顯示在一行(送出哈希值,注釋),看不到reset回退之後的記錄
git log [--oneline]
# 顯示效果
038b811 (HEAD -> master) 增加d.txt
a09f72b 增加c.txt
351e5ec 增加a.txt
b1baca7 增加b.txt
# 也可以使用git reglog,顯示的HEAD@{數字},表明HEAD指針移動到目前指針需要幾步,回退後仍然可以看到所有的版本記錄 友善檢視每個操作步驟所在的版本,可以根據版本号自由前進後退
git reflog
# 顯示效果
038b811 (HEAD -> master) HEAD@{0}: reset: moving to 038b811
9723e41 HEAD@{1}: reset: moving to HEAD
9723e41 HEAD@{2}: commit: 第二次修改d.txt
23a53b3 HEAD@{3}: commit: 修改d.txt
038b811 (HEAD -> master) HEAD@{4}: commit: 增加d.txt
a09f72b HEAD@{5}: commit: 增加c.txt
351e5ec HEAD@{6}: commit: 增加a.txt
b1baca7 HEAD@{7}: commit (initial): 增加b.txt
# 遠端伺服器Git倉庫克隆項目到本地倉庫
git clone <遠端倉庫> [檔案路徑]
# 将工作區的檔案(建立或修改)增加到暫存區進行追蹤
git add <檔案>
# 暫存區的檔案修改後,用git add <檔案>更新暫存區檔案
git add <檔案>
# 暫存區的檔案修改後直接送出(但是跳過了暫存區,是以無法撤銷,檔案無法回退到工作區)
git commint -am 'comment'
# 暫存區的檔案修改後,用git checkout -- <檔案>丢棄修改
git checkout -- <檔案>
# 删除暫存區的檔案,-r:遞歸删除,-f:強制删除
git rm -rf <檔案>
# 取消檔案暫存,檔案傳回工作區中
git rm --cached <檔案>
# 删除工作區的檔案,-r:遞歸删除,-f:強制删除
rm -rf <檔案>
# Git項目送出到本地倉庫
git commit -m 'comment' <檔案>
# 本地倉庫中項目推送到原車給伺服器Git倉庫
git push
# 從遠端伺服器Git倉庫更新項目到本地倉庫
git pull
2.2 回退曆史版本指令
2.2.1 git reset --soft 僅僅在本地倉庫移動HEAD指針,但是本地檔案還是之前最新狀态
2.2.2 git reset --mixed 本地倉庫移動HEAD指針,同時重置暫存區
2.2.3 git reset --hard 本地倉庫移動HEAD指針,同時重置暫存區和工作區
# 重置HEAD指針到某個曆史版本,可以在所有曆史版本中前進或後退,一般與git reflog配合使用
git reset --hard <哈希值>
# 重置HEAD指針到某個曆史版本,隻能後退,n表示後退n步
git reset --hard HEAD~n
# 重置HEAD指針到某個曆史版本,隻能後退,一個^表示後退一步,n個^表示後退n步
git reset --hard HEAD^^^
2.2.4 各種誤删檔案情況
1)在誤删檔案同時送出到本地庫後,可以通過git reset --hard <檔案删除前的版本哈希值>來找回誤删的檔案
git reset --hard <檔案删除前的版本哈希值>
2)添加到暫存區的誤删除檔案找回,解決辦法:hard方式重置本地庫HAAD指針,讓暫存區,工作區和本地庫保持一緻
git add <檔案>
git commit -m '增加檔案' <檔案>
rm -rf <檔案> # 工作區删除檔案
git add <檔案> # 将删除操作變更送出到暫存區
git status # 檢視工作區和暫存區狀态
位于分支 master
要送出的變更:
(使用 "git reset HEAD <檔案>..." 以取消暫存)
删除: e.txt
git reset --hard HEAD # :hard方式重置本地庫HAAD指針,讓暫存區,工作區和本地庫保持一緻
總結:
==前提,删除前,檔案存在于本地庫。==
git reset --hard [HEAD指針位置]
- 删除操作已經提到本地庫,HEAD指向曆史版本位置
- 删除操作尚未送出本地庫,HEAD指向目前版本位置(預設HEAD)
2.3 git diff <檔案> 檔案比較指令
# 修改e.txt後比較(預設和暫存區比較)
git diff <檔案>
# -:表示删除的行,+:表示增加的行
diff --git a/e.txt b/e.txt
index 384c816..f0ebe0a 100644
--- a/e.txt
+++ b/e.txt
@@ -1 +1,5 @@
-eeeeee
+
+
+1234434
+1345454
+dfda
# 增加到暫存區後,顯示沒有任何修改
git diff <檔案>
# 如果和本地庫比較,則和之前一樣顯示删除增加修改的行
git diff HEAD <檔案>
Tips:如果某行同時又删除和增加或者修改操作。會把原有的那行用-表示删除,再把更新好的結果用+表示增加,如以下效果結論:不帶檔案名就是比較多個檔案-dfda +dfdd
git diff <檔案> # 工作區和暫存區比較 git diff [本地庫曆史版本哈希值] <檔案> # 工作區和本地庫比較
2.4 git branch 分支管理
2.4.1 git branch基礎指令
git branch <分支名> # 建立分支
git checkout <分支名> # 切換分支
git branch -v # 檢視所有分支,前面*辨別目前所在分支
2.4.2 合并分支
- 切換到接受修改的分支的上(被合并,增加新内容)
git checkout <被合并的分支名>
- 執行合并指令git merge
git merge <有新内容的分支名> # 檢視目前HEAD指針指向版本 git log --oneline 14b5d83 (HEAD -> xiaotu) 修改c.txt 5a466a3 (master) 增加e.txt 9723e41 第二次修改d.txt 23a53b3 修改d.txt 038b811 增加d.txt a09f72b 增加c.txt 351e5ec 增加a.txt b1baca7 增加b.txt
- 解決沖突
# 目前分支合并另一分支 git merge <分支名> 自動合并 b.txt 沖突(内容):合并沖突于 b.txt 自動合并失敗,,修正沖突然後送出修正的結果。 # 檢視沖突文本,<<<<<<HEAD:目前分支内容,=======:分隔符,>>>>>>>xiaotu:分支xiaotu中的内容 cat <檔案> <<<<<<< HEAD ffffff ======= ccccc >>>>>>> xiaotu # 修改b.txt,删除fffff等文本 cat <檔案> ccccc # 送出到本地庫,注意合并過程中不能單個檔案部分送出 git add <檔案> git commit -m 'comment' # 再次合并 git merge <分支名> # 顯示合并成功 Already up to date.
3. Git的檔案管理機制
3.1 Git檔案系統簡介
Git把資料看作小型檔案系統的一組快照,每次送出更新時Git都會對目前的全部檔案制作一個快照并儲存這個快照的索引。為了高效,如果檔案沒有修改,Git不會重新存儲該檔案,而是隻保留一個連結指向之前存儲的檔案。是以Git的工作方式可以稱之為快照流。
3.2 Git的“送出對象”
送出對象以及父對象形成的鍊條
==切換分之前,master和testing指向目前最新版本,同時HEAD指向分支testing==
graph RL;
head[HEAD] -->testing[testing]
master[master] -->B[f30ab]
testing[testing] -->B[f30ab]
B[f30ab] -->C[34ac2]
C[34ac2] -->D[98ca9]
==切換分之前,testing更新送出後指向最新版本,master依然指向某個曆史版本==
graph RL;
head[HEAD] -->testing[testing]
master[master] -->B[f30ab]
testing[testing] -->A[87ab2]
A[87ab2] -->B[f30ab]
B[f30ab] -->C[34ac2]
C[34ac2] -->D[98ca9]
==切換分之後,HEAD切換指向master主分支==
graph RL;
head[HEAD] -->master[master]
master[master] -->B[f30ab]
testing[testing] -->A[87ab2]
A[87ab2] -->B[f30ab]
B[f30ab] -->C[34ac2]
C[34ac2] -->D[98ca9]
附錄:Hash算法簡介
哈希是一系列的加密算法,各個不同的哈希加密算法雖然強度不同,但是有以下幾個共同點:
- 不管輸入的資料的資料量多大,輸入同一個雜湊演算法,得到的加密長度固定。
- 雜湊演算法确定,輸入資料确定,輸出的資料結果唯一。
- 雜湊演算法确定,輸入資料變化,資料的資料通常變化很大。
- 雜湊演算法不可逆
==Git底層采用的是SHA-1算法==
雜湊演算法可以被用來驗證檔案。原理如下圖所示: