生活分享

Git、分支、diff 與還原

Git 保存檔案版本,分支承接一組修改,diff 顯示差異。Codex 可以協助操作,但你仍要確認修改屬於這次任務。聊天紀錄與 Git 歷史不同,恢復舊對話不會自動還原檔案。

閱讀時間約 15 分鐘 · 操作 30 分鐘

實作順序示意圖,非產品介面截圖。
圖片:Mokaair (© Mokaair)
回總目錄:Codex 學習中心:完整教學目錄

實作 · Desktop / CLI / VS Code / JetBrains

本篇目錄
  1. 目標與準備
  2. 步驟 1:建立獨立基準
  3. 步驟 2:在分支上做兩個可辨認修改
  4. 步驟 3:只暫存一檔,再練習還原
  5. 步驟 4:提交指定修改,再保留歷史撤回
  6. 命令對照、常見問題與驗收

目標與準備

先熟悉。工作目錄是目前磁碟內容,暫存區是下一次 commit 要包含的內容,commit 是已記錄的版本;三者可能不同。分支指向一條版本線,不會自動複製所有未提交檔案。要同時在多份目錄工作,另看,不要把建立分支當作完成備份。

步驟 1:建立獨立基準

在不屬於其他專案的新資料夾 codex-git-lab 放入 expected 的五個檔案。用編輯器開該資料夾與終端機,PowerShell 用 Get-Location、macOS/Linux 用 pwd 核對位置,再跑 git --version。若系統找不到 git,先依平台的 Git 官方安裝說明完成,重開終端機;不要在原本工作庫執行接下來的初始化。

終端機:獨立 Git 基準 · sh
git init -b main
git config user.name "Practice Learner"
git config user.email "learner@example.invalid"
git add index.html style.css app.js core.mjs core.test.mjs
git diff --cached --name-only
git commit -m "Add practice baseline"
git status --short

逐行執行,不略過中間檢查。初次暫存應恰好是五檔,提交後 status 應無變更。姓名與保留網域信箱只寫在這個練習庫的本機設定,不是 GitHub 登入,也沒有 --global。若 commit 遇到你既有的簽章或 hooks 要求,先依自己的設定完成或暫停記錄原因,不改全域政策來追求成功畫面。

步驟 2:在分支上做兩個可辨認修改

終端機:建立分支 · sh
git switch -c codex/title-lab
git branch --show-current

確認分支是 codex/title-lab。用編輯器在 index.html 只把 h1 的 Make room for one small task. 改成 Plan one useful step.。另外在 style.css 最尾端加下面的註解,模擬另一份尚未提交的工作。這次要交付的是標題,CSS 註解必須保留在工作目錄但不能混入標題提交;兩個改動都是教材,無正式資料。

附加到檔案:style.css · css
/* KEEP-MY-NOTE */
終端機:檢查差異 · sh
git status --short
git diff -- index.html style.css

diff 的減號是舊行,加號是新行,周圍未改內容提供定位。檢查 index.html 是否只改 h1,style.css 是否只多註解,不能只看「2 files changed」。如果請 Codex 說明,使用下列唯讀要求,讓它辨認現有工作及本次範圍;不要一開始就叫它提交所有差異。

Codex 提示詞:唯讀核對範圍 · text
Inspect this lab's current branch, status and diff without editing, staging or committing. The intended change is only the h1 title in index.html. The KEEP-MY-NOTE comment in style.css represents separate work and must be preserved. Explain what belongs in the title commit and what must stay outside it.

步驟 3:只暫存一檔,再練習還原

終端機:限定暫存 · sh
git add index.html
git diff --cached --name-only
git diff --cached -- index.html
git diff -- style.css

現在再做一次同檔案的差異比較:不要重新 git add,用編輯器只把已暫存的 Plan one useful step. 改成 Compare one useful step.。執行下面四行,觀察工作目錄、暫存區與 HEAD 的不同版本。

終端機:同檔案的暫存與未暫存差異 · sh
git status --short
git diff --cached -- index.html
git diff -- index.html
git show :index.html

status 應有 MM index.html 和未暫存的 style.css。這裡不是衝突;依 Git status 官方說明,第一欄 M 代表暫存區相對 HEAD 有改動,第二欄 M 代表工作目錄又相對暫存區有改動。cached diff 應是 Make → Plan,普通 diff 應是 Plan → Compare;show :index.html 讀到的是暫存版 Plan。若此時一般提交,Compare 不會自動跟進。

接著按原順序執行兩種 restore。第一行只移出暫存,Compare 仍在編輯器與磁碟;第二行會把 index.html 回復到此時暫存區中的基準舊標題。若略過第一行就做 worktree restore,來源仍是暫存的 Plan,結果會不同。Git restore 官方說明列出這個預設來源差異。執行前確認要丟棄的是這個練習標題;CSS 必須保留。

終端機:先移出暫存,再還原 · sh
git restore --staged -- index.html
git restore --worktree -- index.html
git status --short
git diff -- style.css

此時 status 應只剩 style.css,h1 回到 Make room for one small task.,註解仍在。這是本篇最重要的保留檢查:撤銷自己的修改,不等於把別人的工作一起清乾淨。如果只執行 restore --staged,它並不刪除工作目錄內容;相反地 restore --worktree 會覆寫指定檔案,不能只看到 restore 一詞就把兩者當同義。

步驟 4:提交指定修改,再保留歷史撤回

重新用編輯器把 h1 改成 Plan one useful step.,再次只暫存 index.html 並檢查 cached diff。下面提交只應包含標題,style.css 註解繼續留在工作目錄。用 show 的檔名清單確認真正提交了什麼,不把終端機顯示成功當作範圍一定正確。

終端機:核對並提交標題 · sh
git add index.html
git diff --cached --name-only
git diff --cached -- index.html
git commit -m "Update practice title"
git show --format=short --name-only HEAD
git status --short

撤回已提交修改前先處理工作目錄。本教材只有自己加的 CSS 註解:確認內容已保留核對後,現在明確決定結束這個保留練習,用下列第一行只丟棄它。status 必須乾淨,再檢查最新提交確實是 Update practice title,才對 HEAD 執行 revert。正式工作若仍有其他修改,不照搬這個清理步驟,先保存或另行處理。

終端機:結束註解練習並撤回提交 · sh
git restore --worktree -- style.css
git status --short
git log -1 --oneline
git revert --no-edit HEAD
git log -3 --oneline
git status --short

revert 會新增撤回提交,保留原本標題修改的歷史。預期 h1 回舊值,log 仍看得到基準、標題修改與撤回三筆,工作目錄乾淨。若出現衝突,先讀提示與實際狀態,不連按強制選項;只想取消這次未完成的 revert,可依 Git 指引使用 git revert --abort,之後重新檢查檔案。

命令對照、常見問題與驗收

目的命令核對點
看尚未暫存內容git diff工作目錄與暫存差異
看將提交內容git diff --cached暫存與 HEAD 差異
移出暫存git restore --staged -- index.html編輯仍在
丟棄指定未提交修改git restore --worktree -- index.html先確認來源與路徑
撤回已提交修改git revert --no-edit HEAD新增歷史,先確認目標及乾淨狀態

找不到分支先看是否在對的 repository;status 多出意外檔案就先查看,不使用 git add . 把它們一起帶進去。若同一檔案混有自己的與原有修改,整檔暫存會一起提交,應先讀懂每段差異再分段處理。這次驗收要能證明 CSS 在標題提交中被排除、兩種 restore 效果不同、revert 保留歷史。圖中 1 是辨認狀態,2 是限定提交,3 是驗證還原;下一步看。

19. Git、分支、diff 與還原 — 實作順序示意圖,非產品介面截圖。 Branch → Diff → Commit
19. Git、分支、diff 與還原 — 實作順序示意圖,非產品介面截圖。 Branch → Diff → Commit · 圖片:Mokaair (© Mokaair)
閱讀完整文字說明

Branch to Diff to Commit

回總目錄

  • 生活分享

    Codex 學習中心:完整教學目錄

    從安裝、第一個任務到 MD 規則與進階整合,規劃 60 篇 Codex 教學、十個單元。依程度、平台、需求或指令搜尋下一篇;尚未公開的教學會標示狀態,方便安排學習路線。

  • 生活分享

    實戰:製作小網站

    從 brief.md 規劃並製作 Small Steps 待辦網站,完成新增、完成、刪除、篩選與本機資料保存。將 HTML、CSS、資料函式、畫面事件與測試分開,以 Node 測試和瀏覽器操作驗收,並留下可重新啟動與還原的交接紀錄。

  • 生活分享

    用量與效率:減少重工

    記錄任務條件、模型選項、時間與成果,找出能減少無效重試和過多上下文的調整。

最新旅遊情報攻略

資料來源

生活分享