深入分析Git基本工作原理

2022-04-07 16:00:19
本篇文章給大家帶來了關於的相關知識,其中主要介紹了git的基本工作原理,入門級教學,通過玩轉Git本地倉庫,幫助新手快速入手Git,希望對大家有幫助。

推薦學習:《》

一、分割區及工作流程

1. Git分割區

Git的分割區包括工作區、暫存區、本地倉庫(本地版本庫)、遠端倉庫(遠端版本庫)。

  1. 工作區
    工作區(Workspace)即原生程式碼所在的目錄,同時也是存放 .git/ (本地倉庫)的目錄。

  2. 暫存區
    暫存區(Index/Stage)是工作區和本地倉庫的快取空間,裡面記錄著即將提交給本地倉庫(版本庫)的檔案修改資訊,.git/ 目錄裡的index檔案就是暫存區。

  3. 本地倉庫
    本地倉庫(Repository)也稱本地庫或版本庫,存放了原生的所有版本(commit提交記錄),本地倉庫的檔案都在 .git/ 目錄中。

  4. 遠端倉庫
    遠端倉庫(Remote)在網路上,GitHub、Gitee和GitLab都能建立遠端倉庫,和本地倉庫一樣,遠端倉庫存放的也是不同的程式碼版本,只是這些版本可以來自多個本地倉庫。

2. 工作流程

------------------------------------------------------下圖來源網路---------------------------------------------------------
在這裡插入圖片描述

上圖生動地描述了Git不同分割區之間的操作命令。

  • 假如要實現上傳程式碼功能,工作區使用add新增檔案到暫存區,暫存區再通過commit提交版本給本地倉庫,最後本地倉庫使用push將版本推播到遠端倉庫;
  • 工作區修改的檔案可以通過checkout命令從本地倉庫或暫存區恢復;如果要將工作區某分支的程式碼更新為遠端倉庫最新版本,可以使用pull命令;
  • 對遠端倉庫使用clone可以將遠端倉庫主分支拷貝到本地倉庫,fetch命令與pull類似,只是pull會合並原生程式碼,而fetch只會把最新版本抓取到本地版本庫,不考慮本地倉庫是否有新增。

二、本地倉庫初始化

1. git init

本地倉庫(版本庫)需要使用 git init 命令來建立(也可以直接從遠端倉庫克隆,後面介紹)。
進入工作區(程式碼存放目錄),輸入git init,git會在工作區新建一個.git/目錄:
在這裡插入圖片描述

2. .git/目錄簡單介紹

在這裡插入圖片描述
在一個新建的.git/目錄中,有3個文字檔案:

  • config存放了本地倉庫的設定資訊;
  • description用來描述倉庫的名字;
  • HEAD為本地倉庫當前分支,預設為master,指向了refs/heads/master,可見refs/目錄主要存放一些分支資訊;

後面在對本地倉庫進行操作時,還會產生其他檔案,比如logs/——儲存提交的記錄,index——暫存區。

【注意】 千萬不要手動更改.git/裡的檔案,可能會破壞本地倉庫的結構,造成不良後果。

三、使用者資訊設定

1. 使用者名稱和郵箱設定介紹

初始化本地倉庫後的第一件事情就是給本地倉庫新增使用者設定資訊,包括使用者名稱和郵箱地址,這裡的使用者名稱和郵箱地址和託管平臺(如gitee)的賬戶沒有直接關係,它唯一的作用就是讓別的使用者或託管平臺知道程式碼的上傳者資訊,郵箱亂填也不會導致不能上傳程式碼。

比如下面我用「張三」和「李四」上傳了程式碼,郵箱地址不是真實存在的,同樣可以上傳成功:(commit資訊出了點意外)
在這裡插入圖片描述
李四的郵箱地址顯然不是真實的。
在這裡插入圖片描述
由於「張三」和「李四」的郵箱沒有在gitee繫結賬戶,所以點選它們頭像時,不會顯示使用者資訊,如果使用者設定裡填寫了gitee賬號的提交郵箱,則可以在gitee上檢視上傳者賬號資訊。
在這裡插入圖片描述
gitee使用者的提交郵箱,可以在gitee->個人主頁->個人設定->郵箱管理中設定和檢視:
在這裡插入圖片描述

2.使用git config設定使用者資訊

講了那麼多使用者名稱和郵箱的注意事項,其實使用者資訊設定十分簡單:

git config --global user.name "your name"git config --global user.email "your email"

user.name 後接使用者名稱,任意填寫。
user.email 後接使用者郵箱,任意填寫。
–global 為設定全域性屬性
在這裡插入圖片描述
提交程式碼到本地倉庫時,git會先檢索本地倉庫的.git/config檔案,如果沒有user的資訊,則使用全域性的組態檔(符合就近原則)。

全域性組態檔存放位置為 系統使用者目錄/使用者名稱/.gitconfig,裡面只有user屬性。
在這裡插入圖片描述

不加–global時,僅設定本地倉庫的使用者設定,本地倉庫使用者設定資訊存放位置:.git/config
在這裡插入圖片描述
上圖我僅設定了本地設定的使用者名稱,此時如果提交修改到本地倉庫,提交記錄(下圖)中使用者名稱使用本地設定,因為本地沒有設定使用者郵箱,所以郵箱依然使用全域性設定中指定的郵箱。
在這裡插入圖片描述

四、管理暫存區檔案

設定完使用者資訊後,我們就可以開始考慮提交程式碼了,但是有時候,我們並不想把整個工作區的檔案都提交到本地倉庫(版本庫)。暫存區(index/stage)的存在,替我們解決了這個困擾,我們可以先把程式碼檔案新增到暫存區,如果覺得還需要改動,可以將檔案從暫存區刪除,直到我們覺得檔案選擇得差不多了,再進行下一步(提交到本地倉庫)。

1. Git檔案狀態

在管理暫存區之前,我們還需要了解工作區檔案的幾種狀態:

  • Untracked 未跟蹤,工作區中沒有加入過暫存區的檔案,不參與版本控制;
  • Unmodified 未修改,加入版本控制,但和版本庫中檔案快照相同;
  • Modified 已修改,加入版本控制,而且和上次加入版本庫時的快照不同;
  • Staged 已暫存,下一步可以提交到本地倉庫(版本庫)。

------------------------------------------------------下圖來源網路---------------------------------------------------------
在這裡插入圖片描述
git status命令可以用來檢視工作區檔案當前的狀態:

#檢視特定檔案的狀態
git status [filename]#檢視所有檔案狀態
git status

#精簡的方式顯示檔案狀態
git status -s

2. 新增檔案到暫存區

先檢視工作區所有檔案的狀態,發現還沒有任何檔案:
在這裡插入圖片描述

現在建立3個檔案,再次使用git status(-s表示精簡顯示),3個檔案的狀態為Untracked,??為精簡顯示下Untracked的標誌,意思是新創的檔案沒有被本地倉庫(版本庫)跟蹤。
在這裡插入圖片描述
git add [檔案…] 可以新增一個或多個檔案到暫存區,使檔案狀態變為Staged,A表示該檔案被add到暫存區。
在這裡插入圖片描述
也可以使用 git add . 或 git add -A 將工作區所有檔案新增到暫存庫(除了.gitignore裡宣告的檔案,本文暫不介紹)。
在這裡插入圖片描述

3. 刪除暫存區的檔案

既然可以向暫存區新增檔案,那麼反向操作必然也不能少,git rm --cached [檔案…] 命令可以將暫存區的檔案移除,使其恢復到Untracked狀態。
在這裡插入圖片描述

4. 檔案修改管理

如果已經存入暫存區,但在檔案提交到本地倉庫前,我們對其進行了修改,那麼它的狀態將變為Modified。
在這裡插入圖片描述
對於Modified狀態的檔案,我們可以使用git add將修改後的版本加入到暫存區,也可以使用git checkout -- [file...]將工作區的該檔案恢復到暫存區的版本。

git add a.c重新新增a.c到暫存區:
在這裡插入圖片描述
下圖為使用git checkout -- a.c從暫存區恢復a.c檔案,下圖中我沒有加 「 --」,它的作用是讓checkout不檢測任何其他選項引數,目的是防止該命令把a.c當做一個分支(checkout 還有一個作用是切換分支)。
在這裡插入圖片描述
對Modified狀態下的檔案使用 git diff 可以得出檔案修改的詳細記錄,git diff和diff命令雖然作用都是對比檔案,但git diff的作用是對比不同的狀態下的同一檔案,而diff用來對比兩個不同的檔案。
在這裡插入圖片描述

五、提交檔案到本地倉庫

檔案新增到暫存區的目的就是將其提交到本地倉庫(版本庫),提交命令為git commit -m 「message」

我們可以在commit 後面新增檔案,這樣能指定提交的檔案:
在這裡插入圖片描述
通過git log 可以檢視提交記錄,HEAD為本地倉庫當前分支,指向主分支master:
在這裡插入圖片描述
直接使用 git commit -m 「message」 可以將整個暫存區都提交到本地倉庫:

在這裡插入圖片描述

#以一行的形式顯示所有提交版本:
git log --pretty=oneline

在這裡插入圖片描述

#一行顯示,只顯示雜湊值的前7位:
git log --oneline

在這裡插入圖片描述

#顯示歷史提交版本與當前版本的間隔數:
git reflog

在這裡插入圖片描述

六、推播到遠端倉庫

程式碼檔案提交到本地倉庫後,還需要推播到遠端倉庫進行託管。

1. 建立遠端倉庫

我以碼云為例,遠端倉庫的建立可以通過以下三步實現:
在這裡插入圖片描述

2. 新增遠端倉庫地址

git remote add <name> <url> 命令可以新增遠端倉庫,name為遠端倉庫地址的別名,自定義,url為倉庫網路地址。
如果要用https的方式上傳程式碼,需要新增遠端倉庫https地址;用ssh上傳程式碼,則url填遠端倉庫ssh地址。

先從碼雲倉庫主頁將倉庫地址複製下來:
在這裡插入圖片描述

我將遠端倉庫的本地別名命名為origin:
在這裡插入圖片描述
遠端倉庫可以設定多個,只要本地別名不衝突即可。

3. 檢視遠端倉庫地址

git remote -v 命令可以檢視遠端倉庫地址,也可以通過git config -l檢視
在這裡插入圖片描述

4. 刪除遠端倉庫地址

git remote remove <name> 可以刪除本地別名為name的遠端地址:
在這裡插入圖片描述

5. 推播到遠端倉庫

首先確認遠端倉庫的別名,我當前設定的遠端倉庫https協定地址對應的別名為https,ssh協定地址對應的別名為ssh,這兩個地址其實是一個倉庫,只是協定不同。
在這裡插入圖片描述

https上傳

git push name可以實現本地倉庫的上傳,name為遠端倉庫在組態檔中的別名,使用https上傳,需要輸入賬號和密碼才能完成上傳,Window系統會自動儲存賬號和密碼,如果想修改Window已經儲存的使用者名稱和密碼,可以參考修改Gitee登入憑據。
有時第一次上傳會出現不成功的情況,可以嘗試使用git push -u name master,該命令的作用是將 name 倉庫的主分支作為上流分支,-u和–set-upstream作用相同。
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

ssh上傳

如果要使用ssh上傳,需要先生成SSH密匙,並將公匙儲存到gitee個人設定的SSH公匙設定中,具體過程可以參考:生成SSH密匙,實現程式碼上傳
有時第一次上傳會出現不成功的情況,可以嘗試使用git push -u name master,該命令的作用是將 name 倉庫的主分支作為上流分支,-u和–set-upstream作用相同。
在這裡插入圖片描述
在這裡插入圖片描述

七、從遠端倉庫clone、fetch或pull

1. 克隆遠端倉庫到本地

git的克隆可以將遠端倉庫拷貝到本地,同時自動進行本地倉庫的初始化。
在任意目錄下開啟Git bash,輸入 git clone <repo> [<dir>],repo為遠端倉庫網址,dir為克隆倉庫的存放路徑(可以不用提前建立),如果不填,則預設為遠端倉庫名(不是本地別名)。
[注意]:clone和push一樣需要密碼。
在這裡插入圖片描述
克隆成功,進入該倉庫目錄,和上傳時的工作區一模一樣,提交紀錄檔也相同。
在這裡插入圖片描述

2. 獲取遠端倉庫(fetch)

git fetch的作用是將遠端倉庫的分支拷貝到本地倉庫,並把最新版本儲存在FETCH_HEAD分支,獲取遠端倉庫分支後,還需手動將其合併到當前分支。
命令格式: git fetch [<repository>] ,repository為遠端倉庫的網路地址。
git merge <分支名>用來合併分支
在這裡插入圖片描述

3. 拉取遠端倉庫(pull)

git pull和git fetch類似,但git pull會自動將遠端倉庫的分支合併到原生的當前分支。
在這裡插入圖片描述

推薦學習:《》

以上就是深入分析Git基本工作原理的詳細內容,更多請關注TW511.COM其它相關文章!