03 - 基本工作流程
← 02-安裝與初始設定 | 下一篇 → 04-GitHub入門
🗂️ 初始化一個新的 Git 倉庫
在你想要追蹤的資料夾裡,執行:
# 先切換到你的專案資料夾
cd /path/to/your/project
# 初始化 Git(只需做一次)
git init這個指令會在資料夾裡建立一個隱藏的 .git 資料夾,Git 的所有資料都存在這裡。
📋 查看目前狀態
git status這是你最常用的指令之一,隨時可以執行,了解目前的狀態。
常見的狀態訊息
On branch main ← 目前在 main 分支
Untracked files: ← 新增的檔案,Git 還不知道
notes.md
Changes not staged: ← 有修改但還沒 add 到暫存區
modified: old_note.md
Changes to be committed: ← 已 add,等待 commit
new file: notes.md
➕ 加入暫存區(git add)
在 commit 之前,要先決定「這次要一起存哪些檔案」。
# 加入單一檔案
git add filename.md
# 加入資料夾內的所有檔案
git add folder/
# 加入目前資料夾的所有變更
git add .
# 互動式選擇(進階)
git add -p暫存區(Staging Area)的用途
讓你可以把「一大堆修改」拆成有意義的幾個 commit, 例如:先 commit 修 bug 的部分,再 commit 新功能的部分。
💾 提交(git commit)
# commit 並附上說明訊息(-m = message)
git commit -m "這次修改的說明"好的 commit message 怎麼寫?
| ❌ 不好的例子 | ✅ 好的例子 |
|---|---|
update | 新增 heart failure 的診斷標準 |
fix | 修正 sepsis 抗生素選擇的錯誤 |
aaa | 補充 DKA 的 management 流程 |
常用格式(Conventional Commits)
feat: 新增某功能
fix: 修正某問題
docs: 更新文件
update: 更新現有內容
📜 查看歷史紀錄(git log)
# 完整的 log
git log
# 每個 commit 只顯示一行
git log --oneline
# 圖形化顯示分支
git log --oneline --graph --all輸出範例(--oneline):
a3f1b2c 補充 DKA 治療流程
9e2d4a1 新增 heart failure 筆記
b7c8f3e 初始化筆記資料夾
每行開頭的 7 位字元(如 a3f1b2c)是 commit hash,可以用來回到該版本。
↩️ 回到過去的版本
# 查看某個 commit 的內容(不會修改現在的狀態)
git show a3f1b2c
# 暫時切換到某個舊版本(detached HEAD 狀態)
git checkout a3f1b2c
# 回到最新版本
git checkout main撤銷修改
# 撤銷工作區的修改(還沒 add 的)
git restore filename.md
# 把已 add 的檔案移出暫存區(但保留修改)
git restore --staged filename.md
# 回到某個 commit 的狀態(危險!會丟失後面的 commit)
git reset --hard a3f1b2c🔀 reset vs revert vs restore(最容易搞混的三兄弟)
這三個指令名字很像,但用途完全不同,初學者一定要分清楚:
| 指令 | 動的是什麼 | 會不會改歷史 | 典型情境 |
|---|---|---|---|
git restore | 工作區 / 暫存區的檔案內容 | 不改歷史 | 「我改壞了某個檔案,想還原成上次 commit 的樣子」 |
git reset | HEAD 指標(commit 紀錄往回退) | 會改歷史 | 「我想取消剛剛的 commit,重新整理再 commit」 |
git revert | 新增一個反向 commit | 不改歷史(往前疊) | 「某個舊 commit 有問題,但已經 push 了,要安全地取消它」 |
git restore — 只動檔案,不碰歷史
# 把單一檔案還原成最近一次 commit 的內容(丟棄工作區修改)
git restore notes.md
# 把整個資料夾的修改都丟掉
git restore .
# 從暫存區拿回來(unstage),但保留你的修改
git restore --staged notes.md
# 還原成「某個特定 commit」當時的版本
git restore --source a3f1b2c notes.mdgit reset — 移動 HEAD(三種模式)
# --soft:commit 取消,但修改仍在暫存區(最溫和)
git reset --soft HEAD~1
# --mixed(預設):commit 取消,修改回到工作區(未暫存)
git reset HEAD~1
# --hard:commit 取消,連修改都丟掉(最危險,不可逆)
git reset --hard HEAD~1記憶法
soft → 留在暫存區(已 add) mixed → 留在工作區(未 add) hard → 全部蒸發(謹慎!)
git revert — push 後的安全撤銷
如果有問題的 commit 已經 push 上 GitHub(別人可能已經 pull 了), 就不要用 reset(會改歷史,造成別人衝突),改用 revert:
# 產生一個「抵銷指定 commit」的新 commit
git revert a3f1b2c這樣歷史是往前疊的(多一個 commit 把改動倒回去),對協作者最安全。
口訣:自己本地還沒 push → reset 重來;已經 push 出去 → revert 安全倒退。
🙈 忽略不想追蹤的檔案(.gitignore)
建立一個 .gitignore 檔案,裡面列出不想讓 Git 追蹤的檔案:
# 建立 .gitignore 檔案
touch .gitignore.gitignore 範例內容:
# 系統檔案
.DS_Store
Thumbs.db
# 編輯器設定
.obsidian/workspace.json
.obsidian/cache
# 敏感資料
.env
secrets.txt
# 暫存資料夾
tmp/
.gitignore 常用語法
| 寫法 | 意思 |
|---|---|
secrets.txt | 忽略這個檔名(任何層級) |
*.log | 忽略所有 .log 副檔名的檔案 |
tmp/ | 忽略整個 tmp 資料夾 |
/build | 只忽略根目錄的 build(前面加 /) |
!important.log | 例外:即使被上面規則忽略,這個還是要追蹤(! = 反向) |
docs/**/*.pdf | 忽略 docs 底下任意深度的 .pdf |
.gitignore 對「已經追蹤的檔案」無效
如果一個檔案之前已經被 commit 過,再加進
.gitignore是沒用的,Git 還是會繼續追蹤它。 要先把它從追蹤中移除(但保留本地檔案):git rm --cached secrets.txt # 只移除追蹤,本地檔案還在 git commit -m "stop tracking secrets.txt"
確認某檔案有沒有被忽略
# 檢查為什麼某檔案被忽略(會印出是哪條規則命中)
git check-ignore -v path/to/file🔄 完整的日常工作流程
1. 修改檔案
↓
2. git status ← 確認哪些檔案有變動
↓
3. git add . ← 把想存的檔案加到暫存區
↓
4. git commit -m "說明這次修改了什麼" ← 存一個版本快照
↓
5. git push ← 推到 GitHub(見下一章)
📌 小結
| 指令 | 用途 |
|---|---|
git init | 初始化新 repo |
git status | 查看目前狀態 |
git add . | 加入所有變更到暫存區 |
git commit -m "訊息" | 建立一個版本快照 |
git log --oneline | 查看歷史紀錄 |
git restore 檔案 | 撤銷工作區修改 |
← 02-安裝與初始設定 | 下一篇 → 04-GitHub入門
