今日目標
• 回顧第三週所有進階技能
• 整合查詢、優化、救援技巧
• 完成綜合實戰專案
• 準備進入第四週的實戰應用
第三週學習回顧
已掌握的進階技能:
Day 主題 核心技能
Day 15 Git 歷史查詢 log、blame、bisect、搜尋
Day 16 Git Hooks 自動化檢查、pre-commit、pre-push
Day 17 大型專案管理 Submodules、Sparse Checkout
Day 18 效能優化 gc、壓縮、shallow clone
Day 19 錯誤修復救援 reflog、reset、revert、救援
Day 20 IDE 整合 VS Code、GitLens、視覺化
綜合實戰:建立企業級專案
專案目標:
建立一個展示所有進階技能的專案:
實戰步驟
步驟1:建立優化的專案結構
mkdir advanced-git-project
cd advanced-git-project
git init
git config core.fsmonitor true
git config core.untrackedcache true
git config pack.threads 4
mkdir -p {src,docs,tests,scripts,.githooks}
cat > README.md << 'EOF'
本專案展示以下 Git 進階技能:
# 安裝 Git Hooks
./scripts/setup.sh
# 開始開發
git checkout -b feature/your-feature
專案結構
.
├── src/ # 原始碼
├── docs/ # 文件
├── tests/ # 測試
├── scripts/ # 腳本工具
├── .githooks/ # Git Hooks
└── README.md # 說明文件
EOF
git add README.md git commit -m "docs: 建立專案說明文件"
### **步驟2:設定 Git Hooks(Day 16)**
**建立 commit 訊息檢查:**
```bash
cat > .githooks/commit-msg << 'EOF'
#!/bin/bash
commit_msg=$(cat "$1")
# 檢查格式
if ! echo "$commit_msg" | grep -qE "^(feat|fix|docs|style|refactor|test|chore):"; then
echo "❌ Commit 訊息格式錯誤!"
echo ""
echo "正確格式:"
echo " feat: 新增功能"
echo " fix: 修復問題"
echo " docs: 文件更新"
exit 1
fi
# 檢查長度
if [ ${#commit_msg} -lt 10 ]; then
echo "❌ Commit 訊息太短(至少 10 個字元)"
exit 1
fi
echo "✅ Commit 訊息格式正確"
EOF
chmod +x .githooks/commit-msg
建立 pre-commit 檢查:
cat > .githooks/pre-commit << 'EOF'
#!/bin/bash
echo "🔍 執行 pre-commit 檢查..."
# 檢查敏感資訊
if git diff --cached | grep -iE "(password|secret|api_key)" > /dev/null; then
echo "❌ 警告:偵測到可能的敏感資訊"
exit 1
fi
# 檢查檔案大小
for file in $(git diff --cached --name-only); do
if [ -f "$file" ]; then
size=$(wc -c < "$file")
if [ $size -gt 1048576 ]; then # 1MB
echo "❌ 檔案太大:$file ($(($size/1024))KB)"
exit 1
fi
fi
done
echo "✅ 所有檢查通過"
EOF
chmod +x .githooks/pre-commit
建立安裝腳本:
cat > scripts/setup.sh << 'EOF'
#!/bin/bash
echo "🔧 設定開發環境..."
# 設定 Git Hooks 路徑
git config core.hooksPath .githooks
# 設定效能優化
git config core.fsmonitor true
git config core.untrackedcache true
# 設定使用者資訊(如果尚未設定)
if [ -z "$(git config user.name)" ]; then
echo "請輸入你的名字:"
read name
git config user.name "$name"
fi
if [ -z "$(git config user.email)" ]; then
echo "請輸入你的 Email:"
read email
git config user.email "$email"
fi
echo "✅ 環境設定完成!"
EOF
chmod +x scripts/setup.sh
# 提交
git add .githooks/ scripts/
git commit -m "chore: 新增 Git Hooks 和安裝腳本"
步驟3:建立歷史查詢工具(Day 15)
cat > scripts/git-stats.sh << 'EOF'
#!/bin/bash
echo "📊 Git 專案統計"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
# 總提交數
echo "📝 總提交數:$(git rev-list --count HEAD)"
# 貢獻者統計
echo ""
echo "👥 貢獻者排名:"
git shortlog -sn --all | head -5
# 最近活躍檔案
echo ""
echo "🔥 最常修改的檔案:"
git log --pretty=format: --name-only | sort | uniq -c | sort -rg | head -5
# 最近 7 天的提交
echo ""
echo "📅 最近 7 天提交數:$(git log --since='7 days ago' --oneline | wc -l)"
# 程式碼行數統計
echo ""
echo "📏 程式碼統計:"
echo " 總檔案數:$(git ls-files | wc -l)"
# Repository 大小
echo ""
echo "💾 Repository 大小:"
git count-objects -vH | grep "size-pack"
EOF
chmod +x scripts/git-stats.sh
# 提交
git add scripts/git-stats.sh
git commit -m "feat: 新增 Git 統計工具"
步驟4:建立維護腳本(Day 18)
cat > scripts/maintenance.sh << 'EOF'
#!/bin/bash
echo "🔧 開始 Git 維護..."
# 備份
echo "💾 建立備份..."
BACKUP_BRANCH="backup-$(date +%Y%m%d-%H%M%S)"
git branch $BACKUP_BRANCH
echo " 備份分支:$BACKUP_BRANCH"
# 清理未引用物件
echo ""
echo "🗑️ 清理未引用物件..."
git prune --expire=7.days.ago
# 垃圾回收
echo ""
echo "♻️ 執行垃圾回收..."
git gc --auto
# 檢查完整性
echo ""
echo "🔍 檢查 repository 完整性..."
if git fsck --full --no-progress > /dev/null 2>&1; then
echo " ✅ 完整性檢查通過"
else
echo " ⚠️ 發現問題,請檢查"
fi
# 顯示大小
echo ""
echo "📊 Repository 狀態:"
git count-objects -vH
echo ""
echo "✅ 維護完成!"
EOF
chmod +x scripts/maintenance.sh
git add scripts/maintenance.sh
git commit -m "chore: 新增維護腳本"
步驟5:建立救援指南(Day 19)
cat > docs/RESCUE.md << 'EOF'
# Git 救援指南
## 常見問題與解決方案
### 1. 誤刪 Commit
```bash
# 查看歷史操作
git reflog
# 找到被刪除的 commit
# 假設是 a1b2c3d
# 恢復
git reset --hard a1b2c3d
2. 誤刪分支
# 查看 reflog
git reflog
# 重建分支
git branch 分支名稱 <commit-hash>
3. Commit 錯分支
# 在錯誤分支上
git log # 記下 commit hash
# 切換到正確分支
git checkout 正確分支
# 撿回 commit
git cherry-pick <commit-hash>
# 回到錯誤分支刪除
git checkout 錯誤分支
git reset --hard HEAD~1
4. 想修改最後一次 Commit
# 修改訊息
git commit --amend -m "新訊息"
# 加入忘記的檔案
git add 檔案
git commit --amend --no-edit
5. Push 錯了想撤回
# 如果還沒有人 pull
git reset --hard HEAD~1
git push -f origin 分支名稱
# 如果已經有人 pull
git revert HEAD
git push origin 分支名稱
預防措施
• ✅ 重要操作前先建立備份分支
• ✅ 定期推送到遠端
• ✅ 使用 Git Hooks 預防錯誤
• ✅ 不確定的操作先在測試分支嘗試 EOF
git add docs/RESCUE.md git commit -m "docs: 新增救援指南"
### **步驟6:建立 .gitignore(最佳實踐)**
```bash
cat > .gitignore << 'EOF'
# 依賴套件
node_modules/
vendor/
# 建置輸出
dist/
build/
*.min.js
*.min.css
# 環境設定
.env
.env.local
*.local
# IDE
.vscode/
.idea/
*.swp
# 作業系統
.DS_Store
Thumbs.db
# 日誌
*.log
logs/
# 暫存
*.tmp
*.temp
.cache/
# 測試
coverage/
.nyc_output/
EOF
git add .gitignore
git commit -m "chore: 新增 .gitignore"
步驟7:建立 Git 設定文件
cat > .gitattributes << 'EOF'
# 設定行尾符號
* text=auto
*.sh text eol=lf
*.bat text eol=crlf
# 大型檔案(如果使用 Git LFS)
*.zip filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text
EOF
git add .gitattributes
git commit -m "chore: 新增 Git 屬性設定"
________________________________________
實戰測試
測試1:Hooks 檢查
# 測試錯誤的 commit 訊息
echo "test" > test.txt
git add test.txt
git commit -m "add test"
# 應該被阻止
# 測試正確的格式
git commit -m "feat: 新增測試檔案"
# 應該成功
測試2:歷史查詢
# 執行統計腳本
./scripts/git-stats.sh
# 查看特定作者的提交
git log --author="你的名字" --oneline
# 搜尋特定功能
git log --grep="feat" --oneline
測試3:效能優化
# 測試操作速度
time git status
time git log --oneline -100
# 執行維護
./scripts/maintenance.sh
測試4:救援演練
# 建立測試分支
git checkout -b test-rescue
# 建立幾個 commit
echo "v1" > rescue-test.txt
git add rescue-test.txt
git commit -m "feat: v1"
echo "v2" >> rescue-test.txt
git add rescue-test.txt
git commit -m "feat: v2"
# 誤刪
git reset --hard HEAD~2
# 救援
git reflog
# 找到 v2 的 hash 並恢復
git reset --hard <hash>
________________________________________
整合所有技能的工作流程
完整開發流程:
# 1. 環境設定(Day 16, 18)
./scripts/setup.sh
# 2. 建立功能分支
git checkout -b feature/advanced-search
# 3. 開發過程中查詢歷史(Day 15)
git log --grep="search" --oneline
git blame src/search.js
# 4. 提交時自動檢查(Day 16)
git add .
git commit -m "feat: 實作進階搜尋功能"
# Hooks 自動執行檢查
# 5. 如果出錯,使用救援(Day 19)
git reflog
git reset --hard <correct-commit>
# 6. 定期維護(Day 18)
./scripts/maintenance.sh
# 7. 查看統計(Day 15)
./scripts/git-stats.sh
# 8. 使用 IDE 輔助(Day 20)
# 在 VS Code 中查看 diff、解決衝突
# 9. 推送前最後檢查
git log --oneline -5
git status
# 10. 推送
git push origin feature/advanced-search
________________________________________
第三週技能檢查清單
✅ 歷史查詢(Day 15):
□ 會用 git log 查詢提交記錄
□ 會用 git blame 追蹤程式碼作者
□ 會用 git grep 搜尋程式碼
□ 會用 git bisect 找出 bug 來源
□ 能快速找到需要的歷史資訊
✅ 自動化(Day 16):
□ 會建立 pre-commit hook
□ 會建立 commit-msg hook
□ 會設定專案共享的 hooks
□ 能自動檢查常見錯誤
□ 了解何時使用自動化
✅ 專案管理(Day 17):
□ 理解 Monorepo vs Multi-repo
□ 會使用 Git Submodules
□ 會使用 Sparse Checkout
□ 能管理大型專案結構
□ 了解不同策略的優缺點
✅ 效能優化(Day 18):
□ 會診斷效能問題
□ 會優化 Git 設定
□ 會執行 git gc 清理
□ 會使用 shallow clone
□ 能大幅提升操作速度
✅ 錯誤救援(Day 19):
□ 理解 git reflog 的重要性
□ 會救援誤刪的 commit
□ 會救援誤刪的分支
□ 會撤銷錯誤的操作
□ 能處理各種災難情況
✅ IDE 整合(Day 20):
□ 會在 VS Code 中使用 Git
□ 安裝了必要的擴充功能
□ 會用視覺化工具查看 diff
□ 會用圖形介面解決衝突
□ 結合 IDE 和命令列使用
________________________________________
第三週學習成果
🏆 你現在具備:
• ✅ 完整的 Git 查詢分析能力
• ✅ 自動化工作流程建立能力
• ✅ 大型專案管理經驗
• ✅ 效能優化實戰技巧
• ✅ 錯誤救援專業技能
• ✅ IDE 與命令列整合運用
💼 職場競爭力提升:
• ✅ 能快速定位和解決問題
• ✅ 建立高效的開發流程
• ✅ 處理複雜的專案結構
• ✅ 成為團隊的 Git 專家
• ✅ 提供技術支援和指導