1. 程式人生 > 其它 >Git本質及操作

Git本質及操作

技術標籤:工具安裝使用git

Git本地結構

  • 工作區 – 寫程式碼的區域

    git add操作後代碼會從工作區儲存到暫存區

  • 暫存區 – 打算提交而未提交的程式碼存放區(可提交可撤回)

    git commit後代碼會從暫存區提交到本地庫

  • 本地庫 – 真實存在的歷史版本

Git遠端結構

  • 遠端庫

    • 遠端庫建立者git push操作後會將本地庫的程式碼推送到遠端庫
    • git clone操作後會將遠端庫的程式碼拉取到本地庫,並初始化本地庫
    • 遠端庫非建立者需要被邀請到遠端庫的團隊中才能進行push操作
    • git pull會將遠端庫的最新程式碼拉取到本地庫
    • 遠端庫操作有團隊內協作、團隊外協作。團隊外的fork
      操作

Git本地庫操作

本地庫初始化
1. git init - 初始化一個空的本地庫,生成.git檔案目錄
2. .git目錄下存放的就是本地庫相關的子目錄和檔案,不能隨意刪除、修改
3. 設定簽名
	作用:區分不同開發人員的身份
	注意:這裡設定的簽名和登入遠端庫的賬號、密碼沒有任何關係
	作用域:
		倉庫級別:僅在當前本地庫範圍內生效(配置後在./git/config檔案中)
			git config user.name xxx
			git config user.email [email protected]
		系統級別:登入當前作業系統的使用者範圍(配置後在C:/user/xxx/.gitconfig檔案中)
			git config --global user.name xxx
			git config --global user.email 
[email protected]
級別優先順序:倉庫級別優先與系統級別,二者都設定時採用倉庫級別2的簽名,二者都沒有不允許
基本操作
1. git status -- 檢視本地庫狀態
   	資訊說明 
    	On branch master  -- 當前是在master分支。	
    	No commits yet    -- 還沒有已commit提交的檔案,即本地庫中還沒有檔案。	
    	Untracked files   -- 未被追蹤的檔案,即還未提交到暫存區。
2. git add -- 從工作區提交到暫存區
  		操作:git add  指定檔名  OR .(. 代表工作區中所有的檔案)
3. git commit -- 從暫存區提交到本地庫(沒有-m會進入vim編輯器進行寫描述
  		 操作:git commit -m "提交描述" 指定檔名  OR .(. 代表工作區中所有的檔案)
檢視歷史記錄(只要本地commit了就在歷史記錄中)
  • git log
    在這裡插入圖片描述

    1. commit部分為雜湊索引
    2. HEAD為指向當前版本的指標
    3. 其他資訊為作者、提交時間、提交描述
    
  • git log --pretty=oneline 查詢當前HEAD指標所在位置之前的所有版本,不顯示之後的版本

    簡化了部分其他資訊

  • git log --oneline查詢當前HEAD指標所在位置之前的所有版本,不顯示之後的版本(區別:簡化了索引,只使用前7位)

    簡化了部分其他資訊,並且只取雜湊索引的前7位

  • git reflog 查詢本機從第一次clone到當前的時間的所有操作,不顯示clone之前的操作(推薦)

    [email protected]{移動到當前版本需要的步數}

  • 前進和回退歷史記錄

    • 基於雜湊索引值操作(長短索引都可以,可前進可回退)

      git reset --hard 雜湊索引值
      
    • 使用^符號(只可回退,一個 ^ 回退一個版本)

      git reset --hard HEAD^^^ 表示回退三個版本
      
    • 使用~符號(只可回退)

      git reset --hard HEAD~3 表示回退3個版本
      
  • reset的三個引數比較

    • –soft(只是將本地庫版本移動到HEAD指標處,此時相當於add之後commit之前。)

      git reset --soft 索引值
      
    • –mixed(將本地庫、暫存區的版本移動到HEAD指標處,此時相當於add之前。可用於回退commit)

      git reset --mixed 索引值
      
    • –hard (將本地庫、暫存區、工作區的版本都移動到HEAD指標處,三者版本一致

    比較檔案差異
    • git diff 檔名

      將工作區中的檔案和暫存區中對應的檔案做比較
      
    • git diff HEAD 檔名

      將工作區中的檔案和本地庫中對應的檔案做比較
      
    • git diff HEAD^ 檔名

      將工作區中的檔案和本地庫中對應檔案的上一個版本做比較
      
    • git diff

      不指定檔名是將工作區中的所有檔案和暫存區中對應的檔案做比較
      
    分支管理

    定義:在版本控制過程中,使用多條線同時推進多個任務

    好處:1. 並行推進多工;2. 每個分支之間相互獨立,一個分支開發失敗,並不影響其他分支。

    • 查詢當前分支

      git branch -v
      
    • 建立分支(複製主分支現有的版本)

      git branch 分支名稱
      
    • 切換分支

      git checkout 分支名稱
      
    • 合併分支

      1. 必須切換到接受合併的分支上(將2分支合併到master主分支,需要切換到master分支)
      	git checkout 分支名(master)
      2. git merge 分支名(2分支)
      
    • 解決合併衝突

    在這裡插入圖片描述

    1. 分支處顯示merging表示有合併衝突
    2. 將出現衝突的地方和衝突當事人商量後刪除衝突標記(等號和箭頭標識部分),並將內容進行合併
    3. git add 檔名,將衝突解決後的檔案提交暫存區
    4. git commit -m "描述" 《注意:此處不能指定檔名進行commit,否則git直接報錯》
    5. 檢視分支處的衝突標識是否訊息
    
    git 原理

    hash演算法

    1. 常見種類:MD5、SHA1、CRC32
    2. 共同特點
    	1. 不管輸入資料的資料量有多大,採用同一個雜湊演算法加密,得到的結果長度固定。
    	2. 雜湊演算法相同,輸入資料相同的情況,輸出資料也始終是同一個
    	3. 雜湊演算法相同,輸入資料有變化,輸出資料肯定也不同
    	4. 雜湊演算法不可逆
    3. 雜湊演算法驗證檔案傳輸過程是否有損壞的原理
    	1. 伺服器端用雜湊加密原始檔案,得到密文
    	2. 檔案傳輸後到達終端,用和伺服器端同樣的雜湊演算法加密,得到密文。
    	3. 比較兩此密文的結果是否相同
    
    • git底層採用SHA1的雜湊演算法進行檔案的驗證

    • git檔案管理機制細節

      1. 每一個檔案都會用雜湊SHA1演算法加密得到一個固定密文
      2. 一次commit就生成一個tree樹物件,指向當此提交的所有檔案的雜湊密文
      3. tree樹也會使用雜湊演算法加密成固定密文
      4. 每一次commit的“提交物件”都會包含一個tree屬性,其值就是tree雜湊後的密文
      5. 提交物件同樣使用雜湊加密,該物件生成的密文就是git log檢視到的雜湊值
      6. 每一個提交物件都會有parent的父提交物件(即上一個版本),該屬性指向其父提交物件的雜湊密文
      
    • git分支本質

      分支模型 版本1 版本2 版本3 master 版本4 分支1 HEAD
      1. HEAD為當前選中分支
      2. Gie建立分支不是像svn一樣將所有檔案重新複製一份,而是將分支1的指標指向版本3
      

GIt遠端庫操作

生成SSH金鑰免密登入
1. cd ~
2. rm -rvf .ssh
3. ssh-kengen -t rsa -C git郵箱
		C是大寫的
4. cd .ssh
5. cat id_rsa.pub
6. 複製id_rsa檔案內容,登入git,設定SSH keys中貼上即可。
在本地建立遠端庫地址別名
作用:用別名代替http長連線地址
1. 查詢遠端庫在本地的別名
		git remote -v
2. 建立別名
		git remote add origin(遠端庫地址別名) git遠端倉庫的https地址/SSH地址(推薦使用SSH免密)
克隆遠端庫到本地庫
git clone 遠端庫地址
1. 把遠端庫檔案下載到本地
2. 給本地建立遠端庫地址的別名origin
3. 初始化本地庫(有.git檔案)
拉取遠端庫到本地庫
1. 讀取遠端庫檔案,將更新部分下載到本地。此操作並不該表本地庫的內容,需要進行合併。
		git fetch origin(遠端庫地址別名) master(遠端分支名)
2. 檢視fetch到本地的遠端master分支的更新內容
		git checkout origin(遠端庫地址別名)/master(遠端分支名)
3. 遠端master合併到本地master
		git merge origin(遠端庫地址別名)/master(遠端分支名)
4. git pull = git fetch + git merge的操作
		git pull origin(遠端庫地址別名) master(遠端分支名)
本地庫推送到遠端庫
1. git push 遠端庫地址別名 遠端分支名
		注意:推送需要加入團隊後才能操作
git push衝突
1. push操作需要本地庫處於遠端庫的最新版本下才能進行推送,否則報錯。
2. 遠端push衝突解決和合並分支衝突解決方式一樣