1 Git(版本控制工具)是什麼?
Git 的四層結構(Four Stages)
Git 把你的文件在四個地方來回搬,每一層都有名字:
commit(提交),真正「上雲端」是 push(推送)。
這兩個動作是分開的,因為 commit 很頻繁(改完就存),push 只在想備份或給別台電腦用時才做。
2 Git 命令小白表(15 條最常用)
每條命令都有:英文全稱 → 中文意思 → 生活比喻 → 什麼時候用。從上到下大致按「使用順序」排列。
| 命令 | 英文全稱 | 中文意思 | 生活比喻 | 什麼時候用 |
|---|---|---|---|---|
git init |
initialize | 初始化 | 在房間裝監控攝像頭,從今天起任何改動都被錄下 | 新資料夾第一次要用 Git(版本控制工具)時 |
git clone |
clone(克隆 / 複製) | 克隆 | 從雲端完整抄一份到本地(含歷史記錄) | 第一次拿別人 / 自己雲端倉庫的代碼到本機 |
git status |
status(狀態) | 狀態 | 看房間有沒有亂(哪些文件改了 / 哪些還沒存檔) | 想知道目前情況,不知道接下來該做什麼時第一招 |
git add |
add(加入) | 加入暫存 | 把改好的衣服放進洗衣籃(暫存區) | 改完文件、準備要存檔前 |
git commit |
commit(提交) | 提交存檔 | 按洗衣機啟動鍵,留一個永久記錄,要寫說明 | git add 之後,想讓這次改動進入歷史 |
git push |
push(推送) | 推送雲端 | 把本地存檔上傳到雲端保險箱(GitHub) | 想備份、給另一台電腦用、或 commit 累積夠了 |
git pull |
pull(拉取) | 拉取雲端 | 從雲端保險箱下載最新存檔回本地 | 換電腦開工第一步、別人改了代碼、同步雙機 |
git log |
log(日誌) | 歷史日誌 | 翻看時光機記錄本,看過去每次存檔 | 想回顧誰何時改了什麼、找某個版本 |
git diff |
difference(差異) | 差異對比 | 對比修改前後哪些行不同(逐行顯示) | 改完想檢查自己到底改了什麼 |
git branch |
branch(分支) | 分支 | 創個平行宇宙實驗,壞了不影響主線 | 做新功能 / 實驗 / 重構時 |
git checkout |
check out(切換 / 簽出) | 切換分支 | 從一個平行宇宙跳到另一個 | 想切到不同分支工作(新版 git switch 更直覺) |
git merge |
merge(合併) | 合併 | 兩個平行宇宙合體,實驗成果併回主線 | 實驗分支做完、確認 OK,要併回 master(主分支) |
git rebase |
rebase(變基 / 換底座) | 變基 | 把你的修改重新疊在最新版上面,歷史更乾淨 | pull 時避免多餘的合併記錄(Thomas 白 pass 規則) |
git worktree |
work tree(工作樹) | 工作樹 | 多開幾個平行宇宙資料夾同時工作,不互擾 | 同時做多個實驗、多個 Claude 分工、不想互相卡 |
git reset |
reset(重置) | 重置 | 時光回溯,取消某次存檔(有軟硬兩種程度) | 存錯了、commit 訊息打錯、想回到之前某個版本 |
pull --rebase)。
這張表是讓你懂背後發生什麼,不是要你記住怎麼打。
3 Git 常見符號 / 參數表
看到 Git 命令裡奇奇怪怪的符號不用怕,下面這張表幫你翻譯。
| 符號 | 英文名 | 中文名 | 意思 | 範例 |
|---|---|---|---|---|
-- |
double dash | 雙橫線 | 長參數前綴(完整英文單詞) | git pull --rebase |
- |
single dash | 單橫線 | 短參數前綴(單一字母縮寫) | git commit -m "msg" |
origin |
origin(源頭) | 源頭 | 默認的雲端倉庫暱稱(GitHub 那個) | git push origin master |
HEAD |
HEAD(頭) | 當前頭 | 當前所在的 commit(提交點) | git reset HEAD |
master / main |
master / main | 主分支 | 默認主線分支名(舊稱 master,新稱 main) | git checkout master |
. |
dot(點) | 當前目錄 | 代表這個資料夾所有東西 | git add .(全部加入) |
^ |
caret(尖號) | 上一個 | 前一個 commit(提交) | HEAD^ = 上一次存檔 |
~ |
tilde(波浪號) | 往前 N 個 | 往前數 N 個 commit | HEAD~3 = 往前 3 次存檔 |
--force / -f |
force(強制) | 強制 | ⚠️ 危險:覆蓋雲端 / 其他電腦 | git push --force(Thomas 永久禁用) |
--rebase |
rebase(變基) | 變基模式 | pull 時避免產生合併記錄,歷史乾淨 | git pull --rebase origin master |
-m "msg" |
message(訊息) | 訊息參數 | commit 時順便寫一句說明 | git commit -m "修改 README" |
git push --force 會直接覆蓋雲端,毀掉另一台電腦(筆記本 / 台式機)的工作。
CLAUDE.md(記憶規則文件)明令禁止,兩台電腦協作鐵律之一。遇到衝突用 git pull --rebase,衝突停下來手動解決,絕不 force push。
4 PowerShell(PS,Windows 命令列)是什麼?
cmd.exe(命令提示字元)更強大,
能自動化一切:批次改名、遠端連電腦、跑排程任務、裝軟體...
圖形界面 vs 命令列 對比
| 項目 | 圖形界面(GUI) | 命令列(PowerShell) |
|---|---|---|
| 操作方式 | 滑鼠點來點去 | 打字下指令 |
| 學習門檻 | 低(看圖就會) | 高(要記指令) |
| 速度 | 慢(要開視窗 / 找選單) | 快(一行搞定) |
| 批次處理 | ⛔ 100 個文件要點 100 次 | ✅ 一行處理 10000 個 |
| 自動化 | ⛔ 沒辦法 | ✅ 寫腳本定時跑 |
| 遠端控制 | RDP(遠端桌面),要盯著螢幕 | WinRM(遠端管理),背景跑 |
動詞-名詞」,例如:
Get-Item(取-項目)、Set-Location(設-位置)、New-Item(新建-項目)。
動詞只有那幾個(Get/Set/New/Remove/Copy/Move/Start/Stop),名詞是對象。
記住動詞規律,你能猜對 80% 新命令。
5 PowerShell 命令小白表(14 條最常用)
PowerShell 有兩套命名:短別名(像 Linux,方便打字)和長命令(Verb-Noun,語意清楚)。兩種都能用,效果一樣。
| 短別名 / 長命令 | 英文全稱 | 中文意思 | 生活比喻 | 對應 Linux |
|---|---|---|---|---|
ls / Get-ChildItem |
list / get child item | 列出 | 看這個資料夾有什麼東西 | ls |
cd / Set-Location |
change directory / set location | 切換目錄 | 走進某個房間(資料夾) | cd |
pwd / Get-Location |
print working directory | 印出當前位置 | 看我現在在哪個房間 | pwd |
cp / Copy-Item |
copy(複製) | 複製 | 影印一份,原件還在 | cp |
mv / Move-Item |
move(移動) | 移動 | 搬走,原位置沒了 | mv |
rm / Remove-Item |
remove(刪除) | 刪除 | 丟垃圾桶(PS 預設不進回收筒,直接沒) | rm |
cat / Get-Content |
concatenate / get content | 顯示內容 | 打開檔案看裡面寫什麼 | cat |
mkdir / New-Item |
make directory / new item | 建資料夾 | 蓋新房間(或新檔案) | mkdir |
echo / Write-Output |
echo / write output | 印出來 | 講一句話給螢幕聽 | echo |
Select-Object |
select object(選取物件) | 選取欄位 | 只看我想看的欄位(不要全部資訊) | awk |
Where-Object |
where object(篩選物件) | 篩選條件 | 只要符合條件的(過濾器) | grep |
ForEach-Object |
for each object(逐個處理) | 逐個處理 | 對每一個東西做同一件事 | for 循環 |
Get-Process |
get process(取進程) | 取進程列表 | 看電腦裡跑著什麼程式 | ps |
Stop-Process |
stop process(停進程) | 停止進程 | 強制關掉某個程式 | kill |
一個實戰範例
# 找出 D 槽所有大於 100MB 的 .mp4 檔案
Get-ChildItem D:\ -Recurse -Filter *.mp4 |
Where-Object { $_.Length -gt 100MB } |
Select-Object Name, Length, LastWriteTime
翻譯:
Get-ChildItem D:\ -Recurse(列出 D 槽所有東西,-Recurse(遞迴)= 含子資料夾)|(管道符,把結果丟給下一步)Where-Object { $_.Length -gt 100MB }(篩選$_(當前這個東西)的大小-gt(大於)100MB)|再丟給下一步Select-Object Name, Length, LastWriteTime(只印檔名、大小、修改時間三欄)
6 PowerShell 符號表
這些符號在 PS 裡超常見,每個都有特定意思,認識後腳本看起來不再像天書。
| 符號 | 英文名 | 中文名 | 意思 | 範例 |
|---|---|---|---|---|
$ |
dollar sign | 美元符號 | 變數前綴(PS 變數一律 $ 開頭) | $name = "Thomas" |
$_ |
dollar underscore | 美元加底線 | 管道裡的「當前這個東西」(自動變數) | ls | Where { $_.Name -like "*.md" } |
| |
pipe(管道) | 管道符 | 把上一步結果丟給下一步 | ls | sort |
-eq |
equal | 等於 | 比較運算(PS 不用 ==) |
$a -eq 5 |
-ne |
not equal | 不等於 | 比較運算 | $a -ne 5 |
-gt / -lt |
greater / less than | 大於 / 小於 | 比較運算 | $a -gt 10 |
-like |
like(像是) | 像是 | 萬用字元匹配(* = 任意) |
-like "*.md" |
-match |
match(匹配) | 正則匹配 | 用正規表達式(Regex)匹配 | -match "^\d+" |
# |
hash(井號) | 井號 | 註解,這行不執行(純說明) | # 這是說明 |
; |
semicolon(分號) | 分號 | 一行跑多條命令 | cd D:\; ls |
` |
backtick(反引號) | 反引號 | 一行太長折到下一行續寫 | Get-ChildItem ` |
@() |
at parens | 陣列符號 | 建陣列(一組東西) | @("a","b","c") |
{} |
curly braces | 大括號 | 包裹代碼塊(Script Block) | { $_.Name } |
- |
hyphen(連字號) | 連字號 | 參數前綴(PS 一律單橫線,不像 Git 有 --) |
-Path "D:\" |
$ 就知道是變數;看到 $_ 就是當前在處理的這個(管道裡的);
看到 | 就是資料往下流;看到 -eq / -gt / -like 就是比較 / 過濾。
PS 不用 == != > <,因為這些在命令列裡有別的意思(> 是寫入檔案)。
7 Git 符號 vs PowerShell 符號對照
Thomas 會在兩個環境跳來跳去,這裡整理兩者差異避免混亂。
| 項目 | Git(版本控制工具) | PowerShell(Windows 命令列) |
|---|---|---|
| 長參數前綴 | -- 雙橫線(例 --rebase、--force) |
- 單橫線(例 -Path、-Recurse) |
| 短參數前綴 | - 單橫線(例 -m、-f) |
PS 沒有短 / 長之分,一律 -,但參數名常有別名 |
| 訊息參數 | -m "msg"(message 縮寫) |
-Message "msg"(完整單詞) |
| 註解符號 | # 井號(.gitignore 裡用) |
# 井號(一樣) |
管道 | |
很少用(Git 命令結果通常直接顯示,偶爾串 grep) | 大量使用,是 PS 核心設計 |
| 當前位置符號 | HEAD(當前提交點) |
.(當前資料夾)/ $PWD(當前路徑變數) |
| 比較運算 | 不用(Git 沒有一般意義的條件比較) | 用 -eq / -ne / -gt / -lt / -like 等文字運算符 |
| 變數 | 環境變數 GIT_* 開頭 |
一律 $ 開頭(例 $env:PATH) |
| 路徑分隔 | Git 在 Windows 也能用 /(正斜線) |
PS 兩種都接受:\(反斜線)或 / |
--(雙橫線),PS 用 -(單橫線)。
下次你在 PS 裡打 --recurse 報錯,改成 -Recurse 就好了。
8 Thomas 最常踩坑的 3 個符號
$_(PS 的「當前這個東西」)坑點:你曾把 $_ 原封不動搬到 Bash(Linux 命令列)裡用,結果 Bash 把它當「最後一個參數」變數,整個腳本行為亂掉。
原理:$_ 是 PS 的管道自動變數,只在 | 後面才有意義。Bash 裡 $_ 是別的東西(上一條命令的最後一個參數)。
$_ = "在管道裡,正在流過這根管子的那個東西"。離開管道(離開 PS)就沒意義。--rebase(pull 時用)坑點:兩台電腦(台式機 + 筆記本)都自動 push/pull,不加 --rebase 會產生一堆「Merge branch...」的多餘合併記錄,歷史亂七八糟。
原理:普通 pull = 「下載 + 合併」,合併會產生新 commit;--rebase = 「下載 + 把我的改動疊在雲端最新版上面」,沒有多餘記錄。
--rebase。CLAUDE.md(記憶規則文件)已寫死,Claude 會自動幫你跑 git pull --rebase origin master。git worktree(工作樹)坑點:聽到「worktree」以為是另一個倉庫,結果是同一個倉庫的第二個資料夾,改了這裡,那裡也看得見歷史。容易刪錯 / 改錯地方。
原理:git worktree = 同一個 Git 倉庫開多個工作資料夾,每個資料夾可以停在不同 branch(分支),互不干擾。適合同時做多個實驗。
額外:Thomas 的 Git 實際工作流(白 pass 規則)
git push→ Claude(AI 助手)自動幫你:先git add .→ 寫 commit 訊息 →git pull --rebase→git pushgit pull→ Claude 自動幫你:git pull --rebase origin master
? FAQ(常見問題)
Q1:我為什麼要學這些命令?平時 Claude(AI 助手)都幫我跑了
A:懂原理後,當命令出錯(例如合併衝突、權限問題)你能看懂 Claude 在幹嘛,不會瞎急。
另外,有些安全鐵律(例如 --force 禁用)你得知道為什麼禁,才不會亂授權。
Q2:為什麼 Git 用 -- 而 PowerShell 用 -?
A:歷史傳統不同。Git 源自 Linux,Linux 傳統是短參數用 -,長參數用 --(區分單字母和完整單詞)。
PowerShell 是微軟新設計,參數名都是完整單詞(沒有單字母縮寫),所以只用一個 - 就夠了。
Q3:PS 的 ls 和 Linux 的 ls 一樣嗎?
A:表面一樣,底層不同。PS 的 ls 是 Get-ChildItem(取子項目)的別名,輸出的是物件(有 Name、Length、LastWriteTime 等屬性);
Linux 的 ls 輸出的是純文字。所以 PS 可以 ls | Where { $_.Length -gt 1MB },Linux 要寫得複雜得多。
Q4:cat file.txt 在 PS 和 Linux 都能用?
A:都能用,效果類似(都是顯示文件內容)。PS 的 cat 是 Get-Content 的別名。
但 PS 輸出的仍是物件(一行一個字串),Linux 輸出的是純文字。日常用法上你感覺不出差別。
Q5:我在 Claude Code 裡面打命令,是用 Bash 還是 PowerShell?
A:Claude Code 在 Windows 上預設用 Bash(Git Bash 模擬環境),不是 PowerShell。
所以 ls、cat、grep 這些 Linux 命令在 Claude Code 的 Bash 工具裡能用,但 PS 專屬的 $_、Where-Object 不能用。
要跑 PS 指令需要加 powershell -Command "..." 包住。
Q6:git reset 會不會刪掉我的文件?
A:看模式。git reset --soft HEAD^(軟重置)= 只取消 commit(提交),文件還在;
git reset --hard HEAD^(硬重置)= 連文件一起回到上一版,改的東西沒了。
永遠先用 --soft,除非你真的想丟。
Q7:Junction(資料夾捷徑)跟 Git 有關嗎?
A:沒直接關,但 Thomas 的雙機系統會用 Junction 把 D:\ClaudeCode 指向 D:\Backup\Downloads(現階段的 CC 家)。
Git 把 Junction 當一般資料夾看,跟蹤的是指向後的真實內容,所以備份照樣正常。