Git——關於Git的一些補充(1)

NeoNexus發表於2024-05-05

Git——關於Git的一些補充(1)

提示:圖床在國外且動圖比較多的情況下,需要時間載入。

目錄:

目錄
  • Git——關於Git的一些補充(1)
    • 提示:圖床在國外且動圖比較多的情況下,需要時間載入。
    • 目錄:
    • Git基礎
      • Git檔案的生命週期
      • Git檔案的儲存空間的劃分
      • Git安裝過程補充說明
      • Git的撤銷操作
        • 修正上一次的提交
        • 撤銷暫存區的檔案
      • Git的rm命令補充
      • Git的diff命令補充
        • Git diff 解析
    • Git的mv命令
    • Github Windows Version Install

[lab.magiconch.com][福音戰士標題生成器]-1695021721029

Git基礎

基礎內容請參考廖雪峰Git教程,這裡只做一點概念的補充,來方便理解。

Git檔案的生命週期

此部分補充上述教程中建立版本庫的部分內容

Git所管理的檔案可以處於以下五種狀態:

未跟蹤(untracked)、未修改(clean)、已修改(modified)、已暫存(staged)、已提交(committed)

sequenceDiagram participant untracked clean ->> untracked:(rm) clean -->> modified:(edit data or code) untracked -->> staged:(add) modified -->> staged: (add) staged -->> +committed:(commit) committed ->>-clean: (committed)

上圖中(瀏覽器右側有切換到淺色主題的按鈕,使用之後看的更清楚),線上的命令代表了在各個狀態變化中使用的命令名稱,狀態clean和其翻譯並對不上,其原因是clean代表的是剛剛完成克隆或者剛剛提交完成之後的倉庫狀態,詳細狀態切換及使用的命令的引數可以參考廖雪峰的教程。其中committed部分指的是每次提交完成之後工作區的程式碼又返回了clean狀態,即沒有變化,更改的意思,並沒有其對應的命令。

由此五種狀態的轉變可以引出——什麼是倉庫?

Git是如何在儲存空間中劃分的?

是如何將的程式碼在各個狀態中進行儲存的?

Git檔案的儲存空間的劃分

  • 工作目錄(Working Directory):工作目錄實際上是專案中某一個版本的單次檢出(check out)。這些檔案是從Git目錄下的壓縮資料庫內被提取出,放置在磁碟上以供使用和修改。也就是你能看到的專案內容。
  • 暫存區(Stage/Index):暫存區是一個檔案,一般位於Git目錄中,儲存了下次提交內容的相關資訊。有時候也被稱之為索引
  • Git目錄(Repository)::Git目錄是儲存專案後設資料和物件資料庫的地方。這是Git最重要的部分,也是其他計算機中克隆倉庫時複製的內容。

在你使用命令之後整個工作流程 上劃分如下:

sequenceDiagram box rgb( 30,144,255, .5) Working Directory participant untracked participant clean participant modified end box rgb(0,255,255, .5) Index participant staged end box rgb(255,65,81,.8) Repository participant committed end clean ->> untracked:(rm) clean -->> modified:(edit data or code) untracked -->> staged:(add) modified -->> staged: (add) staged -->> +committed:(commit) committed ->>-clean: (committed)

藍色部分是你的工作區域,也就是你修改的或者使用的程式碼皆是存在於此的,其中比較重要的是add和commit命令,使用這兩個命令或者操作會將檔案拉入Index區或者Repository區。受限於mermaid畫圖無法巢狀,實際上Index應是Repository區的一部分。

Git安裝過程補充說明

git_pull

在安裝過程中,git會讓你選擇pull操作的邏輯:

Fast-forward操作指的是當前分支所在位置是在已有要合併分支的後面,打個比方:

sequenceDiagram main -->> orgin/main : pull

main節點落後於伺服器上的main(以後都稱之為origin/main),此時執行Fast-forward操作就是將當把伺服器的遠端分支合併到main之上,也就是執行merge操作,此時main指標會向前走一個,這樣的操作就是Fast-forward。

merge操作指的是在本地分支和遠端分支在同一個基點產生分歧的時候如下圖所示:

graph LR First_commit-->Second_commit First_commit --> Remote_commit Second_commit -->merge_commit Remote_commit -->merge_commit

在你的第一次提交之後本地已有個第二次提交,遠端也有一個基於第一次提交的遠端提交,此時就需要merge將兩次提交合併成新的提交:merge_commit,來進行合併。

Rebase操作指的是在上述情況之上直接將Remote_commit修改,再合併到Second_commit之上:

graph LR First_commit-->Second_commit Second_commit -->Remote_commit_changed

這裡選擇預設即可。當然git pull --rebase操作不僅僅能實現這種效果,更多內容請參考下一篇,關於分支管理的內容。

Git的撤銷操作

修正上一次的提交

撤銷上一次的提交指的是上一次的提交會被這次新的提交所覆蓋,假設你的commit資訊在上次輸入錯誤了,我們就可以使用:

git commit --amend

來再次進行提交,這次提交還是會開啟輸入資訊框,修改後資訊就會更新,且上一次提交就被覆蓋了或者說應該是被修正了。

第一次提交:

image-20240504170607739

第二次提交:

image-20240504170440919

撤銷暫存區的檔案

如果你不小心提交了不該提交的內容到index區,我們可以使用:

git reset HEAD filename

來將其從暫存區中刪除,記得不要使用rm,rm同時也會把其從工作區一起刪除,這是二者的區別。

Git的rm命令補充

要從版本管理系統中移除某一個檔案,你需要把它先從已跟蹤檔案列表裡面刪除,然後再提交修改才可以,這裡就要使用rm命令來實現,如果沒有使用git rm,而是簡單的直接從檔案列表刪除,就會產生如下後果:

我們將copy結尾的檔案刪除,其已經被修改後提交:

image-20240504161643586

我們將其手動刪除,檢視git的狀態。

image-20240504162813549

這裡就會提示你有一個刪除操作沒有提交到暫存區,你需要手動使用

git add .

來將刪除操作暫存,並用commit命令提交到committed區。

image-20240504163209617

這樣的操作略顯麻煩,不過問題不大,我們可以直接使用rm命令來進行操作。rm命令會將檔案從暫存區和工作區直接刪除,這樣提交的時候就不會有未跟蹤的檔案提示了。

image-20240504163329446

Git的diff命令補充

在安裝完成之後,我們使用git bash 來檢視 diff,在diff檢視之前我們應該有一個已經committed的版本,方便我們來檢視不同之處,這裡使用的就是本篇文章的儲存庫來檢視,

寫到這裡,我們使用命令:

git diff

效果如下:

image-20240504065415466

上圖紅紅綠綠的部分,就是代表了修改的內容,這個表格是用來檢視你相對於索引(index)(下次提交的暫存區域)所做的修改。 換句話說,這些差異是你_可以告訴 Git 進一步新增到索引中,但你仍然沒有。,我們從頭開始,解析這一段代表的是什麼意思。

Git diff 解析

git所使用的diff是1990年,GNU diff率先推出了"合併格式"的diff,將需要比較檔案的上下文合併在一起顯示的一種diff格式、不同的diff格式不同,目前比較多的是GNU diff格式,git在此基礎上新增了一些資訊,用來顯示一些內容。

第一部分實際上是檔案的基本資訊,用來顯示git的物件:

一般格式如下:

  diff --git a/f1 b/f1

進行比較的是,a版本的f1(即變動前)和b版本的f1(即變動後)。

由於我的檔案包含中文,所以中文被解析成了對應的字元,仔細看實際上是能發現對應的內容的:

image-20240504071327934

然後一行顯示的是兩個版本的git雜湊值(index區域的6f8a38c物件,與工作目錄區域的449b072物件進行比較),最後的六位數字是物件的模式(普通檔案,644許可權)

index a7a1862..fcf1525 100644

第三行表示進行比較的兩個檔案。

image-20240504071546670

"---"表示變動前的版本,"+++"表示變動後的版本。

第二部分,變動的位置用兩個@作為起首和結束。

@@ -33,14 +33,18 @@

-33-代表第一個檔案也就是上一個版本的檔案,33代表第33行,14代表連續14行,合在一起意思就是從33行起連續14行,同樣的,+代表變動後的檔案,從33行開始一直到18行。

第三部分,就是具體的修改內容了:

image-20240504160151147

檔案內容的每一行最前面,還有一個標記位。如果為空,表示該行無變化;如果是感嘆號(!),表示該行有改動;如果是減號(-),表示該行被刪除;如果是加號(+),表示該行為新增。圖片中的+- -- 均為文件自身包含一個-號,與git無關。

參考:讀懂diff - 阮一峰的網路日誌 (ruanyifeng.com)

Git的mv命令

git並不會顯式的跟蹤檔案的移動,如果你在檔案管理系統中,直接重名了檔案,git並不能發覺,會將其認為是一個新的檔案,如此這般我們就需要將檔案重新加入到跟蹤佇列,實際上我們可以說使用git mv命令來實現更快捷的操作:

如圖我們直接修改資料夾中的README.md檔案為README,此時git會發覺到:

image-20240505201754780

不過問題不大我們可以直接用mv來修改,這樣git就會自動將其加入到追蹤檔案中:

git mv README.md README

此時可以看到對應的檔案被變成了這個樣子:

image-20240505201925068

我們直接提交修改即可。需要注意的是,這一個操作相當於將其改名之後,並將其提交到stage區域,如果你想改回來,就需要將暫存區的內容清空使用上文的reset命令,最後再手動將名字修改回來。

Github Windows Version Install

很多人上來就要安裝Git for windows專案,我是不推薦的,Github針對Git開發了更方便的Github Desktop軟體,主要包含GUI和操作,同時也針對了PowerShell做了相容,這一點非常好。便於跨平臺的使用。(這是比較老的說法了,實際上他們放棄了維護CLI部分,專注使用GUI部分,詳見:Where does Github desktop install command line version of Git - Stack Overflow),但對新手來說GUI更適合一點,雖然無法使用全部的Git命令,但GUI已經足夠了。

下載地址如下:GitHub Desktop | Simple collaboration from your desktop

下載後註冊賬號登陸即可:

image-20240319230316232

設定本地Git資訊也是易如反掌,我的建議是對於工具類不需要太過深入瞭解,但是要有求知的心,建議看完Git for Windows專案的教程之後再來看這個會更加理解,本人入門的時候也是用的Git for Windows來進行配置的,整個過程受益頗多。

image-20240319231027438

我們可以簡單過一遍教程:

image-20240319231115582

這裡省略了幾個驗證的細節,只需要點點就可以了,來到正式的介面:

image-20240319231404949

右側寫了教程的步驟,這裡要我們建立一個新的分支,分支的含義在這裡已經詳細闡述了,簡單來說就是可以允許不同版本的程式碼同時在相同倉庫下進行開發。點選建立新的分支之後:

image-20240319231619311 image-20240319231712553

會使用系統預設的編輯器開啟對應文字檔案:

image-20240319231807726

在下方新增以下總結資訊,這對參與專案者十分重要,來標識你幹了什麼。

image-20240319231917272

最後將分支推送到Github之上:

image-20240319232010779

pull request,是將你修改好的程式碼推送到稽核人員那裡,在稽核人員將你實現的功能合併到主分支或者某一個分支之上。

image-20240319232103905

跳轉到網頁進行申請處理

image-20240319232223793

稽核人員稽核之後也就是分支合併之後,可以選擇刪除你的開發分支,刪除之後GIt上就剩下了一個分支。

image-20240319232351124

相關文章