工程部署
Version ControlDevOps

Git 版本控制

Git 是現代軟體開發的基石。無論是個人開發還是團隊協作,掌握 Git 都能讓你更自信地管理程式碼變更、實驗新功能以及修復錯誤。

初始設定

在開始使用 Git 之前,請確保設定好你的使用者名稱與 Email,這將作為你提交紀錄的身份標識。

Terminal
# 設定使用者名稱
git config --global user.name "Your Name"

# 設定 Email
git config --global user.email "your.email@example.com"

# 檢查設定
git config --list

基礎指令

這是 Git 的日常工作流程:修改檔案 -> 加入暫存區 (Stage) -> 提交 (Commit)。

1. 初始化與狀態

Terminal
# 初始化專案
git init

# 查看檔案狀態
git status

2. 暫存與提交

Terminal
# 加入所有變更
git add .

# 提交變更
git commit -m "feat: initial project structure"

3. 查看紀錄

Terminal
# 查看提交歷史
git log --oneline --graph --all

# 查看檔案差異
git diff

4. 撤銷變更

Terminal
# 捨棄工作目錄的修改 (危險!)
git restore .

# 取消暫存 (Unstage)
git restore --staged .

分支操作

分支 (Branch) 讓你可以平行開發新功能,而不影響主程式碼 (main)。

Terminal
# 建立並切換到新分支
git checkout -b feature/login-page
# 或者使用新語法
git switch -c feature/login-page

# 切換回主分支
git switch main

# 合併分支 (將 feature 合併進 main)
git merge feature/login-page

# 刪除分支
git branch -d feature/login-page

遠端協作

與 GitHub 或 GitLab 等遠端倉庫同步。

Terminal
# 複製遠端專案
git clone https://github.com/username/repo.git

# 加入遠端倉庫
git remote add origin https://github.com/username/repo.git

# 推送分支
git push -u origin main

# 拉取更新
git pull origin main

進階技巧

暫存工作 (Stash)

當你正在開發功能 A,突然需要切換去修復 Bug,但又不想提交半成品的程式碼時,Stash 非常好用。

Terminal
# 暫存當前修改
git stash

# 查看暫存列表
git stash list

# 恢復最近一次暫存
git stash pop

時光倒流 (Reset)

Reset 可以用來撤銷 Commit。請小心使用 --hard

Terminal
# Soft Reset: 撤銷 Commit,但保留檔案修改 (回到暫存區)
git reset --soft HEAD~1

# Hard Reset: 徹底捨棄修改,回到上一個版本 (危險!)
git reset --hard HEAD~1

摘櫻桃 (Cherry-pick)

將某個特定的 Commit 複製到當前分支。

Terminal
# 複製特定 Commit
git cherry-pick <commit-hash>

變基 (Rebase)

Rebase 可以讓提交歷史變成一直線,比 Merge 更整潔。但絕對不要在多人共用的分支上使用 Rebase

Terminal
# 將當前分支的基底移到 main 的最新狀態
git rebase main

# 互動式 Rebase (整理 Commit,例如合併多個 Commit)
git rebase -i HEAD~3

最佳實踐

Conventional Commits

使用統一的格式撰寫 Commit Message,有助於自動化生成 Changelog。

  • feat: 新增功能
  • fix: 修復 Bug
  • docs: 文件修改
  • style: 格式調整 (不影響程式碼)
  • refactor: 重構
  • chore: 建置過程或輔助工具的變動

.gitignore

務必忽略不需要進入版本控制的檔案,例如依賴套件、環境變數檔與建置產物。

.gitignore
node_modules/
.output/
.nuxt/
.env
dist/
*.log