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 resetHEAD 指標(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.md

git 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入門