Hub Claude Code 教學

核心篇 · 第 6 章

整合 Git 追蹤進度

上一章你讓 Claude 把專案規矩寫進了 CLAUDE.md。這一章我們幫專案裝上「時光機」——Git。它能替已提交的版本留下可比較、可回復的紀錄;但還原前仍要先看 git status 與 diff,確認哪些未提交修改要保留。聽到「Git」「分支」別緊張,這章你幾乎不用背指令,大多時候用講的請 Claude 幫你做就好。

6.1 先配 Git:你的「時光機」與安全網

Claude 能直接改你電腦裡的檔案——這正是它好用的地方,但也代表萬一它改錯了,你的原稿可能被蓋掉。解法很簡單:先幫專案配一個叫 Git 的工具。每次重要節點做一次 commit,就等於拍下一張「當下的快照」,之後可以比較或回到那一張。把它想成專案的時光機:走錯路時,先看清楚目前有哪些改動,再決定怎麼倒帶。

你可能會想起第 4 章提過的 /rewind——那個能讓你反悔剛剛幾步的 checkpoint 機制。這兩者常被搞混,但差別是關鍵:checkpoint 比較像隨手可撕的便條紙,只在「這次對話」裡有效,換一輪新的對話它就不算數;Git 這台時光機才是正式歸檔的資料夾——不管隔了多久、換了幾輪對話,只要你當初有 commit,那個版本就一直在,隨時能翻出來。

配 Git 前先確認這個資料夾是不是已受 Git 管理。只有尚未受管理的練習資料夾才需要初始化;從 GitHub clone 下來的專案,或 Git 專案裡的子資料夾,通常不用再做一次。確認後有兩條路:完全不想碰指令的人,直接請 Claude 幫忙;想自己動手的人,再在專案資料夾裡執行

真實教訓:Git 是你的安全網

曾經有人給了 AI 工具很大的權限、又完全沒做備份,結果一次失誤弄丟了大量工作,救不回來。Git 是重要安全網,但不是可以跳過檢查的保證:它只能可靠回復已提交或另外保存的內容。讓 Claude 改檔前,先看目前狀態與 diff,重要節點再做 commit。

  1. 動手做

    打開你要工作的專案資料夾

    先用終端機進到你的專案資料夾(第 1 章教過的 cd)。接下來的動作都要在這個資料夾裡做,Git 才會認得是哪個專案。

  2. 動手做

    先確認,再決定要不要設成 Git 專案

    先在專案資料夾輸入 git status。如果看到分支、檔案狀態或「working tree clean」,代表這個專案已經是 Git 專案,不要再執行 git init;直接跳到下一節即可。只有看到「not a git repository」時,才選下面其中一種方式初始化。第一次練習請在你自己建立、沒有重要檔案的資料夾進行。

  3. 確認 Git 認得這個專案了

    設定完,請 Claude 或自己打 git status,看到它開始「報告狀態」就成功了。

    預期會看到
    # 大致會看到這類訊息(實際文字依情況略有不同)
    On branch main
    No commits yet
    nothing to commit (create/copy files and use "git add" to track)
想知道原理:commit 怎麼當「時光機」把東西還原?

每次 commit(存檔)Git 都會記下「這一刻整個專案長什麼樣」,並貼上一個編號。這些快照會一張接一張排成一條線。當你想倒帶,只要告訴 Git「回到某個編號那一刻」,它就把所有檔案還原成當時的模樣——你之後的改動不會消失,只是先退到旁邊。這就是為什麼說 Git 是時光機:它不是只留最後一版,而是把沿途每一個存檔點都保留著,讓你能挑任何一個跳回去。你不用記這些編號,需要時請 Claude:「幫我還原到上一個版本」就行。

進階:別讓 Git 存到不該存的東西

Git 預設「看到什麼存什麼」,但有些東西你根本不希望被記錄下來——例如密碼、API 金鑰,或是套件安裝後產生的大量檔案。解法是在專案根目錄放一個叫 .gitignore 的檔案,把不想被追蹤的檔名或資料夾一行一行列進去,之後 Git 就會自動略過它們。可以直接請 Claude:「幫我建一個 .gitignore,排除 node_modules 和常見的暫存檔」。

如果你的專案本身就是 Claude Code 專案,有兩個東西特別容易忘記排除:.env(環境變數檔,常常放著金鑰密碼)跟 .claude/settings.local.json(你個人的偏好設定,不該跟別人共用)。前者外流風險最高,後者則是手滑 commit 進去後,別人拉下來會被你的個人設定蓋過。

要注意一件事:.gitignore 只能擋「commit 進 Git」,擋不住 Claude 在對話中不小心讀到、貼出檔案內容。真的要把某些檔案徹底列為禁區,需要另外設定權限規則,第 24 章的安全須知會完整說明。

6.2 讓 Claude 幫你 commit(不用背 Git 指令)

配好 Git 之後,最常做的事就是「存檔」——也就是 commit。好消息是你完全不用記指令,直接用講的就好。每做完一段告一段落的工作,就請 Claude 幫你存一次。

一次 會把你這次改了哪些東西打包記下來,並附上一句說明(之後你回頭找版本時,靠這句話就認得出是哪一次改的)。請它做的時候,它會自動:整理這次的改動 → 幫你寫好清楚的說明 → 完成存檔,一條龍。

建議執行:做完一段就請它存一次

幫我把這次的修改 commit,並寫一個清楚的說明。

(習慣英文的人也可以直接打:claude "commit my changes with a descriptive message",效果一樣。)

多久 commit 一次?

沒有硬規定,但「一個小段落完成」就存一次是最好上手的習慣:修好一個地方、加完一個小功能、改完一段文字,都可以順手請 Claude commit。存得勤一點,時光機的「停靠點」就多,之後要倒帶時選擇也多。

順便留意說明的品質:與其讓它寫一句空泛的「update files」,不如明確要求「commit,說明要寫清楚改了什麼、為什麼改」。像「修正登入頁密碼強度檢查,補上失敗時的錯誤提示」這種具體描述,會比「小修正」有用得多——半年後你回頭找某個版本,靠的就是這句話。

進階:commit 訊息裡那行 Co-Authored-By 是什麼?

如果你檢查 Claude 幫你存的 commit,可能會發現訊息最後多了一行類似 Co-Authored-By: Claude ... 的署名,開 PR 時說明欄也會多帶一行小小的標註文字。這是預設行為,用來標示這次改動有 AI 協作參與,自用或朋友共學的專案留著通常無妨。如果你的專案有嚴格的 commit 規範、或就是不想要這行字,可以在專案的 .claude/settings.json 裡把兩個欄位都設成空字串關掉它(設定欄位可能隨版本調整,實際寫法以官方 settings 文件為準):

{
  "attribution": { "commit": "", "pr": "" }
}

6.3 開分支、開 Pull Request

如果你想試一個新點子,又怕改壞現在好好的版本,就是為這個而生的。它像幫你開一個「平行時空」:你在裡面盡情實驗、做新功能,完全不影響原本的主線。試成功了就合併回來,試壞了就丟掉那個時空,主線毫髮無傷。

做完一個分支的東西,通常會開一個 (簡稱 PR),意思是「我這邊改好了,請看一下、把它合併回主線」。團隊一起做事時這是最常見的流程;就算只有你自己一個人,用 PR 也能讓每次改動留下清楚的紀錄。這些你都不用手動操作,講給 Claude 聽就好。

開始前先確認你真的有 PR 的目的地。

這個專案需要已連到 GitHub 遠端 repo,且你有推送權限;電腦也需要安裝並登入 GitHub CLI。先在終端機執行 gh auth status,確認顯示的是你自己的 GitHub 帳號。沒有 GitHub repo、沒有權限,或只是本機練習資料夾時,先練分支與 commit,不要執行開 PR 的提示詞。

建議執行:用講的請它開分支、開 PR

幫我開一個新分支叫 feature/login,把這個登入功能做在這個分支上。
做完幫我開一個 Pull Request。

它會幫你建好分支、把改動推上去、開好 PR,整個流程一氣呵成。

想讓 PR 說明更完整?拆成幾句話跟它說

一句「幫我開一個 PR」通常就夠用,Claude 會自己去看這個分支跟主線差在哪裡,生出一份說明。但如果這次改動比較大、想要說明寫得更仔細,拆成幾個步驟講效果會更好——因為每一句都多給它一點「這次到底改了什麼、為什麼改」的線索:

# 第一步:先請它摘要這次改了什麼
幫我摘要這次的修改內容。

# 確認摘要沒問題,再請它開 PR
幫我開一個 Pull Request。

# 想要說明更完整,再追加這句
PR 說明可以再寫詳細一點嗎?把改動的原因也帶進去。

訣竅是先讓它看過完整的改動,再動筆寫說明。如果劈頭就要它「寫 PR 說明」,手上卻只有零星幾句對話可以參考,寫出來的說明常常很空泛(像「一些小修正」這種沒營養的句子);先摘要、再開 PR、有需要再加碼補細節,是比較穩的順序。

開完 PR,這個對話會自動跟它「綁」在一起

用 Claude 開好 PR 之後,這個對話會自動跟那個 PR 綁定。下次想接著討論同一個 PR(可能隔了一天,或換了台電腦),不用重講一次前因後果:把 PR 網址直接貼進 /resume 選單,或啟動時打 claude --from-pr 加上 PR 編號,都能把那個 PR 的上下文接回來,省下重新解釋一遍的力氣。

開 PR 一直失敗?先檢查 gh CLI 裝好了沒

Claude 開 PR 靠的是 GitHub 官方工具 gh(GitHub CLI)在背後幫忙送出請求。如果你的電腦沒裝這個工具,或裝了但還沒登入,請它開 PR 就會失敗。先自己在終端機打一次 gh auth status 確認:有登入會顯示你的帳號;沒有的話,跑 gh auth login、照畫面指示登入一次即可,之後就不用再處理這一步。

進階:推上去之前,先讓它自己審一遍

/code-review

這個指令會請 Claude 切換成「審查者」角度,重新看一遍目前分支上還沒併回主線的改動,抓明顯的 bug 或寫法疏漏。先看它回報的問題與建議,再決定是否修正;不要因為它說「完成」就略過 diff 與必要檢查。以後如果你的專案想要「每個 PR 都自動被審一遍」而不用自己動手打指令,第 11 章會教你怎麼把這個能力接進 GitHub,變成全隊都受惠的自動化。

分支(branch)

像一個「平行時空」,讓你在不影響主線的情況下安心做實驗、做新功能。試壞了丟掉就好,主線不受牽連。

Pull Request(PR)

請人(或你自己)審查、再把你的改動「合併」回主線的請求。是團隊協作最常見的流程,自己一個人用也能留下清楚紀錄。

6.4 處理合併衝突

有時候兩個人、或兩個分支,剛好改到同一行程式,Git 就不知道該聽誰的——這就叫 (合併衝突)。第一次遇到別慌,這在團隊協作裡很常見,而且不難解。

第一次親眼看到,它長得像這樣——Git 把兩邊的版本都攤開來,用符號夾在中間,等你(或 Claude)決定要留哪個:

<<<<<<< HEAD
這是你這邊的版本
=======
這是另一邊(分支或別人)的版本
>>>>>>> feature/login

<<<<<<< HEAD======= 之間是你這邊的版本,=======>>>>>>> 之間是對方的版本——這些符號不是錯誤訊息,是 Git 老實告訴你「這裡我沒辦法自己決定,兩份都先留著」。

你不需要自己一行一行去比對,直接請 Claude 幫你處理就好。它會把衝突的地方一個一個攤開、判斷該保留哪邊(或兩邊都留),逐一幫你收拾乾淨。

建議執行:交給它逐一處理

幫我解決這些合併衝突。

衝突不是出錯,是 Git 在等你決定

看到「conflict」這個字不代表你做錯什麼,只是 Git 遇到「同一行有兩種改法」時,它不敢自己亂選,所以停下來問你。Claude 會幫你看懂每一處衝突、給出合理的合併方式,你確認就好。處理完記得再 commit 一次,把「已經喬好」這件事也存進時光機。

它不是逐行機械比對,是先搞懂兩邊想做什麼

Claude 處理衝突有章法:先看 Git 目前卡在哪個動作的第幾步(合併、rebase 還是 cherry-pick),再用 git log 看兩邊各自的改動脈絡,理解「這一行改動背後想達成什麼」,才決定怎麼收尾。碰到「雙方都合理、只是各自加了不同東西」這種情況(例如兩邊都在同一段程式碼裡加了新欄位),它常常能兩邊都保留、合併出一個同時滿足雙方用意的版本,而不是只能「留我的」或「留對方的」二選一。這也是為什麼交給它處理,常常比自己一個一個 hunk 手動比對更快,也更不容易漏掉對方原本的用意。

🪟 團隊裡有人用 Windows?留意換行符號地雷

如果專案有人用 Windows、有人用 Mac/Linux 一起共用,偶爾會遇到怪現象:明明只改了一行,git diff 或衝突卻顯示整個檔案都不一樣。兇手通常是換行符號不一致——Windows 習慣的換行方式跟 Mac/Linux 不同,存檔時如果被整批換掉,Git 就會把每一行都當成「改過」。解法是在專案根目錄放一個 .gitattributes 檔案,明確告訴 Git 這個專案統一用哪種換行方式,之後不管誰在哪個系統存檔,都會自動轉成同一種。可以直接請 Claude:「幫我加一個 .gitattributes,統一換行符號」。

6.5 worktree:同時平行做好幾件事

6.3 的「分支」讓你開出平行時空,但一次只能站在一個時空裡——切過去做 A,就離開了 B。如果你想真的同時做好幾件事(一邊讓 Claude 開發新功能、另一邊同時修一個 bug),這就輪到 出場了。

一句話說:worktree 讓你在同一個專案底下,開出好幾個各自獨立的工作資料夾,每個資料夾待在不同的分支上、互不干擾。配合多個 Claude(多代理人)一起跑,就能讓它們平行改不同分支而不會打架——A 在它的資料夾蓋房子,B 在它的資料夾修水管,兩邊的檔案完全不會互相覆蓋。

你幾乎不用記指令:在 Claude 對話中直接說「在 worktree 裡工作」,它就會自己幫你開好一個獨立工作區。這是進階用法,新手現在看過、知道有這條路就好,等你開始想「一次推進好幾件事」時再回來用。

現在不用學會,知道它解決什麼就夠了

worktree 是給「想同時並行好幾條工作線」的人準備的進階功能,背後牽涉多代理人協作。如果你目前都是一次專心做一件事,完全用不到也沒關係——把這節當作一張地圖:知道未來有這條路、它能讓多個 Claude 平行工作不打架,需要時再翻回來即可。

# 最省事:在對話中直接請 Claude 幫你開
幫我在一個 worktree 裡工作。

想更精確一點,也可以直接在啟動指令上加 --worktree(簡寫 -w)帶一個名字,Claude 會自動幫你開好一塊獨立工作目錄、切到一個新分支,這個對話之後所有的讀檔、改檔都只發生在那塊目錄裡,完全不會碰到你原本工作中的檔案:

# 開一塊叫 feature-x 的獨立工作區,直接進去工作
claude --worktree feature-x

# 也可以直接指向一個既有的 PR 編號,開一塊專屬工作區研究它
claude --worktree "#1234"

第二種寫法很適合接續 6.3 的 PR 場景——想仔細看一個同事開的 PR,又不想動到手上正在做的東西,開一塊專屬工作區看就對了。這裡只是先破題,完整的 worktree 玩法(怎麼指定用哪個分支當起點、怎麼讓多個子代理各拿一塊互不干擾),第 18 章「平行與 Worktree」有一整章專門教。

不透過 Claude、想自己手動管理 worktree 也完全可以,就是幾個標準 Git 指令:

# 開一個新工作區,並在上面建一個新分支 feature-a
git worktree add ../project-feature-a -b feature-a

# 看看目前開了哪些工作區
git worktree list

# 用完了,把這個工作區收掉
git worktree remove ../project-feature-a

用完的 worktree 通常會自己收,但有一種情況不會

一般情況下,對話結束時如果那塊 worktree 裡沒有未存檔的改動,Claude 會自動幫你把它跟對應的分支一起清掉;有改動的話,會先問你要保留還是刪除。但如果是非互動模式(寫在腳本裡直接跑,沒人在旁邊回答問題)搭配 worktree,結束時不會有人跳出來問,用不到的工作區就會一直留在 .claude/worktrees/ 底下越堆越多。可以定期用 git worktree list 檢查、git worktree remove 清掉沒用到的,或乾脆把整個 .claude/worktrees/ 加進 .gitignore,眼不見為淨。

這一章你做到了

你已經幫專案裝好時光機(Git)、學會請 Claude 幫你存檔(commit)、開平行時空(分支/PR)、遇到合併衝突也不再慌,也知道未來能用 worktree 一次並行好幾件事。從現在起,你有了較安全的工作方式:修改前先確認目前 Git 狀態,重要節點做 commit,修改後看 diff、跑必要檢查。要還原時,先請 Claude列出可回復選項與各自會影響的檔案,你確認後再執行;不要只因為它說「已完成」就直接覆蓋目前工作。下一章我們進到進階篇,聊聊怎麼跟 Claude 配合得更順、更聰明的工作心法。