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. 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衝突解決和合並分支衝突解決方式一樣