iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0
自我挑戰組

30天 Git 版本控制實戰筆記系列 第 21

Day 21:第三週實戰演練 - 進階技能整合

  • 分享至 

  • xImage
  •  

今日目標
• 回顧第三週所有進階技能
• 整合查詢、優化、救援技巧
• 完成綜合實戰專案
• 準備進入第四週的實戰應用
第三週學習回顧
已掌握的進階技能:
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

git init

設定效能優化(Day 18)

git config core.fsmonitor true
git config core.untrackedcache true
git config pack.threads 4

建立專案結構

mkdir -p {src,docs,tests,scripts,.githooks}

建立 README

cat > README.md << 'EOF'

進階 Git 專案實戰

專案特色

  • 🔍 完整的歷史追蹤
  • 🤖 自動化檢查機制
  • ⚡ 優化的 Git 設定
  • 🛡️ 錯誤防護機制
  • 📊 詳細的開發文件

開發技能展示

本專案展示以下 Git 進階技能:

  • Git 歷史查詢與分析
  • Git Hooks 自動化
  • 效能優化配置
  • 錯誤預防與救援
  • IDE 整合應用

快速開始

# 安裝 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 專家
•	✅ 提供技術支援和指導


上一篇
Day 20:Git 與 IDE 整合 - 圖形化介面提升效率
下一篇
Day 22:Git Flow 工作流程 - 企業級分支管理策略
系列文
30天 Git 版本控制實戰筆記22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言