首頁 >開發工具 >Git >深入分析Git基本工作原理

深入分析Git基本工作原理

WBOY
WBOY轉載
2022-04-07 13:30:523853瀏覽

這篇文章為大家帶來了關於Git的相關知識,其中主要介紹了git的基本工作原理,入門級教程,透過玩Git本地倉庫,幫助新手快速入手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基本工作原理

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

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

二、本地倉庫初始化

1. git init

本地倉庫(版本庫)需要使用git init 指令來建立(也可以直接從遠端倉庫克隆,後面介紹)。
進入工作區(程式碼存放目錄),輸入git init,git會在工作區新建一個.git/目錄:
深入分析Git基本工作原理

2. .git/目錄簡單介紹

深入分析Git基本工作原理
在一個新建的.git/目錄中,有3個文字檔案:

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

#後面在對本地倉庫進行操作時,也會產生其他文件,例如logs/——保存提交的記錄,index——暫存區。

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

三、用戶資訊配置

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

初始化本地倉庫後的第一件事情就是給本地倉庫添加用戶配置信息,包括用戶名和郵箱地址,這裡的用戶名和郵箱地址和託管平台(如gitee)的帳戶沒有直接關係,它唯一的作用就是讓別的用戶或託管平台知道代碼的上傳者信息,郵箱亂填也不會導致不能上傳程式碼。

例如下面我用「張三」和「李四」上傳了程式碼,郵件地址不是真實存在的,同樣可以上傳成功:(commit訊息出了點意外)
深入分析Git基本工作原理
李四的郵箱地址顯然不是真的。
深入分析Git基本工作原理
由於「張三」和「李四」的郵箱沒有在gitee綁定帳戶,所以點擊它們頭像時,不會顯示用戶信息,如果用戶配置裡填寫了gitee帳號的提交郵箱,則可以在gitee上查看上傳者帳號資訊。
深入分析Git基本工作原理
gitee使用者的提交郵箱,可以在gitee->個人主頁->個人設定->郵箱管理中設定和檢視:
深入分析Git基本工作原理

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

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

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

user.name 後接使用者名,任意填寫。
user.email 後接用戶信箱,任意填寫。
–global 為配置全域屬性
深入分析Git基本工作原理
提交程式碼到本機倉庫時,git會先檢索本地倉庫的.git/config文件,如果沒有user的信息,則使用全域的設定檔(符合就近原則)。

全域設定檔存放位置為 系統使用者目錄/使用者名稱/.gitconfig,裡面只有user屬性。
深入分析Git基本工作原理

不加–global時,僅設定本地倉庫的使用者配置,本地倉庫使用者配置資訊存放位置:.git/config
深入分析Git基本工作原理
上圖我僅設定了本地配置的用戶名,此時如果提交修改到本地倉庫,提交記錄(下圖)中用戶名使用本地配置,因為本地沒有配置用戶郵箱,所以郵箱仍然使用全域配置中指定的郵箱。
深入分析Git基本工作原理

四、管理暫存區檔案

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

1. Git檔案狀態

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

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

-------------------------------------------------- ----------------下圖來源網------------------------------ ---------------------------
深入分析Git基本工作原理
git status指令可以用來查看工作區檔案目前的狀態:

#查看特定文件的状态
git status [filename]#查看所有文件状态
git status

#精简的方式显示文件状态
git status -s

2. 新增檔案到暫存區

先查看工作區所有檔案的狀態,發現還沒有任何檔案:
深入分析Git基本工作原理

现在创建3个文件,再次使用git status(-s表示精简显示),3个文件的状态为Untracked,??为精简显示下Untracked的标志,意思是新创的文件没有被本地仓库(版本库)跟踪。
深入分析Git基本工作原理
git add [文件…] 可以添加一个或多个文件到暂存区,使文件状态变为Staged,A表示该文件被add到暂存区。
深入分析Git基本工作原理
也可以使用 git add . 或 git add -A 将工作区所有文件添加到暂存库(除了.gitignore里声明的文件,本文暂不介绍)。
深入分析Git基本工作原理

3. 删除暂存区的文件

既然可以向暂存区添加文件,那么反向操作必然也不能少,git rm --cached [文件…] 命令可以将暂存区的文件移除,使其恢复到Untracked状态。
深入分析Git基本工作原理

4. 文件修改管理

如果已经存入暂存区,但在文件提交到本地仓库前,我们对其进行了修改,那么它的状态将变为Modified。
深入分析Git基本工作原理
对于Modified状态的文件,我们可以使用git add将修改后的版本加入到暂存区,也可以使用git checkout -- [file...]将工作区的该文件恢复到暂存区的版本。

git add a.c重新添加a.c到暂存区:
深入分析Git基本工作原理
下图为使用git checkout -- a.c从暂存区恢复a.c文件,下图中我没有加 “ --”,它的作用是让checkout不检测任何其他选项参数,目的是防止该命令把a.c当做一个分支(checkout 还有一个作用是切换分支)。
深入分析Git基本工作原理
对Modified状态下的文件使用 git diff 可以得出文件修改的详细记录,git diff和diff命令虽然作用都是对比文件,但git diff的作用是对比不同的状态下的同一文件,而diff用来对比两个不同的文件。
深入分析Git基本工作原理

五、提交文件到本地仓库

文件添加到暂存区的目的就是将其提交到本地仓库(版本库),提交命令为git commit -m “message”

我们可以在commit 后面添加文件,这样能指定提交的文件:
深入分析Git基本工作原理
通过git log 可以查看提交记录,HEAD为本地仓库当前分支,指向主分支master:
深入分析Git基本工作原理
直接使用 git commit -m “message” 可以将整个暂存区都提交到本地仓库:

深入分析Git基本工作原理

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

深入分析Git基本工作原理

#一行显示,只显示哈希值的前7位:
git log --oneline

深入分析Git基本工作原理

#显示历史提交版本与当前版本的间隔数:
git reflog

深入分析Git基本工作原理

六、推送到远程仓库

代码文件提交到本地仓库后,还需要推送到远程仓库进行托管。

1. 创建远程仓库

我以码云为例,远程仓库的创建可以通过以下三步实现:
深入分析Git基本工作原理

2. 添加远程仓库地址

git remote add 命令可以添加远程仓库,name为远程仓库地址的别名,自定义,url为仓库网络地址。
如果要用https的方式上传代码,需要添加远程仓库https地址;用ssh上传代码,则url填远程仓库ssh地址。

先從碼雲倉庫首頁複製倉庫位址:
深入分析Git基本工作原理

我將遠端倉庫的本機別名命名為origin:
深入分析Git基本工作原理
遠端倉庫可以設定多個,只要本地別名不衝突即可。

3. 查看遠端倉庫位址

git remote -v 指令可以查看遠端倉庫位址,也可以透過git config -l查看
深入分析Git基本工作原理

4. 刪除遠端倉庫位址

git remote remove 可以刪除本機別名為name的遠端位址:
深入分析Git基本工作原理

#5. 推送到遠端倉庫

首先確認遠端倉庫的別名,我目前設定的遠端倉庫https協定位址對應的別名為https,ssh協定位址對應的別名為ssh,這兩個位址其實是一個倉庫,只是協議不同。
深入分析Git基本工作原理

https上傳

git push name可以實現本地倉庫的上傳,name為遠端倉庫在設定檔中的別名,使用https上傳,要輸入帳號和密碼才能完成上傳,Window系統會自動儲存帳號和密碼,如果想修改Window已經儲存的使用者名稱和密碼,可以參考修改Gitee登入憑證。
有時第一次上傳會出現不成功的情況,可以嘗試使用git push -u name master,該命令的作用是將name 倉庫的主分支作為上流分支,-u和–set-upstream作用相同。
深入分析Git基本工作原理
深入分析Git基本工作原理
深入分析Git基本工作原理

ssh上傳

如果要使用ssh上傳,需要先生成SSH密匙,並將公匙保存到gitee個人設定的SSH公匙設定中,具體過程可以參考:生成SSH密匙,實現代碼上傳
有時第一次上傳會出現不成功的情況,可以嘗試使用git push -u name master,此指令的功能是將name 倉庫的主分支作為上流分支,-u和–set-upstream作用相同。
深入分析Git基本工作原理
深入分析Git基本工作原理

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

1. 複製遠端倉庫到本機

git的克隆可以將遠端倉庫拷貝到本地,同時自動進行本地倉庫的初始化。
在任意目錄下開啟Git bash,輸入git clone [

],repo為遠端倉庫網址,dir為克隆倉庫的存放路徑(可以不用提前創建),如果不填,則預設為遠端倉庫名(不是本地別名)。
[注意]:clone和push一樣需要密碼。
深入分析Git基本工作原理
複製成功,進入該倉庫目錄,和上傳時的工作區一模一樣,提交日誌也相同。
深入分析Git基本工作原理

2. 取得遠端倉庫(fetch)

git fetch的作用是將遠端倉庫的分支拷貝到本地倉庫,並把最新版本保存在FETCH_HEAD分支,取得遠端倉庫分支後,還需手動將其合併到目前分支。
指令格式: git fetch [] ,repository為遠端倉庫的網路位址。
git merge 用來合併分支
深入分析Git基本工作原理

#3. 拉取遠端倉庫(pull)

git pull和git fetch類似,但git pull會自動將遠端倉庫的分支合併到本地的目前分支。
深入分析Git基本工作原理

推薦學習:《Git影片教學

以上是深入分析Git基本工作原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除