iT邦幫忙

2025 iThome 鐵人賽

DAY 5
0
Software Development

深入一點點認識 Git系列 第 5

Day 5-深入一點點認識 Git:上層瓷器指令複習(本地端未開分支流程)

  • 分享至 

  • xImage
  •  

從今天開始,一連三天,我們將快速複習 git 上層的「瓷器(porcelain)」指令,日後再一一拆解每個步驟,仔細觀察下完這些指令之後,git 內部發生哪些變化。

從創建 git 資料夾開始

指令如下:

  1. mkdir code(創建一個名為 code 的資料夾)
  2. cd code(進到 code 資料夾裡面)
  3. git init(初始化 git 資料夾)

https://ithelp.ithome.com.tw/upload/images/20250905/20178513wKVIXPgQw3.png

這時終端機會顯示 git 倉儲已經被初始化,我們得以在裡面進行各種 git 的操作。

因為目前 git 主分支名稱已從 mastermain,若預設的分支仍顯示 master,我自己會用 git branch -m master main 指令改成 main

https://ithelp.ithome.com.tw/upload/images/20250905/201785136iFtC65LLM.png

形成 commit 的基本流程

Commit(git 官方譯名為「提交」)是一個版本的快照(snapshot),而在檔案透過 git commit 指令形成 commit 前,會先從我們編輯檔案的「工作目錄(working directory)」經 git add 指令先進入預存區(staging area):

https://ithelp.ithome.com.tw/upload/images/20250905/20178513IidjvV1fUA.png

現在讓我們以 touch 指令在剛剛創建的 git 資料夾新建一個檔案:

touch hello_world.txt

接著以 git add 指令把 hello_world.txt 放到預存區:

git add hello_world.txt

這時可以用 git status 檢查,可發現 hello_world.txt 變成綠色,代表該檔案已被放進預存區:
https://ithelp.ithome.com.tw/upload/images/20250905/20178513VBLEPdDMeS.png

接著以 git commit 指令形成一組快照,commit 訊息為 "initial commit"

git commit -m "initial commit"

圖示如下,可發現建立了一個雜湊碼為 510100a... 的 commit:
https://ithelp.ithome.com.tw/upload/images/20250905/20178513pyuo3dj8o0.png

日後也可以透過 git loggit log --oneline 觀察 commit 的歷程紀錄:
https://ithelp.ithome.com.tw/upload/images/20250905/20178513mWlGh4WBX8.png

如果要退版呢?

假設發現有 commit 做錯了,想要退版,可以用 git resetgit revert 處理,但兩者的效果並不相同。

現在我們先用 touch 再建立一個檔案(假設為 wrong_file.txt),經 git addgit commit 形成第二個版本:

https://ithelp.ithome.com.tw/upload/images/20250905/20178513VEya9c5cFJ.png

使用 git reset

現在用 git log --oneline 可發現共有兩個 commit:
https://ithelp.ithome.com.tw/upload/images/20250905/20178513Mu8Wk2EXcK.png

9f40842... 這個 commit 是錯的,我們想要退回 510100a... 的狀態,可以用以下指令:

git reset 510100a

就可以發現 510100a... 這個 commit 消失、在此 commit 才被加進去的檔案 wrong_file.txt 也被退出預存區,不過透過 ls 檢查會發現還在工作目錄:
https://ithelp.ithome.com.tw/upload/images/20250905/201785135LZJPlLTRn.png

使用 git revert

如果使用 git revert 指令,則會產生新的 commit 回到先前狀態如下:
https://ithelp.ithome.com.tw/upload/images/20250905/20178513q6CoWdlbGp.png

現在多了一個雜湊碼為 3b3082b... 的 commit,但跟剛剛 git reset 不同的是,若以 ls 檢查,wrong_file.txt 已經不在工作目錄了。

為什麼會有這樣的差別?待我們細看這些指令與其變形在 ./git 資料夾造成的變化,將能從 git 內部的運作機制一窺究竟。

小結

使用上層的瓷器指令要將檔案加入或移出 commit 時,主要有下列四者:

  1. git add:把檔案從工作目錄放到預存區。
  2. git commit:把預存區檔案放到 .git/ 倉儲,形成一筆 commit 快照。
  3. git reset:退回前面的 commit,把原新 commit 才出現的變化移出預存區,工作目錄不影響。
  4. git revert:產生新 commit 變成欲退回原 commit 的狀態,工作目錄也會連帶影響。

參考資料

  1. Renaming the default branch from master
  2. 1.3 開始 - Git 基礎要點
  3. git-reset
  4. git-revert

上一篇
Day 4-深入一點點認識 Git:那些 Git 物件的雜湊碼是怎麼算出來的?
下一篇
鐵人賽 Day 6-深入一點點認識 Git:上層瓷器指令複習(本地端分支管理)
系列文
深入一點點認識 Git6
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言