天天看點

Git 知識點Git 知識點

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設定如下:

Git 知識點Git 知識點
Git 知識點Git 知識點

顯示效果:

Git 知識點Git 知識點

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指針,但是本地檔案還是之前最新狀态

Git 知識點Git 知識點

2.2.2 git reset --mixed 本地倉庫移動HEAD指針,同時重置暫存區

Git 知識點Git 知識點

2.2.3 git reset --hard 本地倉庫移動HEAD指針,同時重置暫存區和工作區

Git 知識點Git 知識點
# 重置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 合并分支

  1. 切換到接受修改的分支的上(被合并,增加新内容)
    git checkout <被合并的分支名>           
  2. 執行合并指令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            
  3. 解決沖突
    # 目前分支合并另一分支
    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的工作方式可以稱之為快照流。
           
Git 知識點Git 知識點

3.2 Git的“送出對象”

Git 知識點Git 知識點

送出對象以及父對象形成的鍊條

Git 知識點Git 知識點
Git 知識點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算法==

雜湊演算法可以被用來驗證檔案。原理如下圖所示:

Git 知識點Git 知識點

繼續閱讀