今日目標
• 學習處理常見的 Git 錯誤
• 掌握資料救援技巧
• 能夠撤銷錯誤的操作
• 成為團隊的 Git 問題解決專家
為什麼需要學習救援?
職場真實情況:
😱 常見的災難:
同事A:「我不小心刪除了重要檔案!」
同事B:「我 commit 錯分支了!」
同事C:「我把 main 分支搞亂了!」
實習生:「我把專案砍掉了...」
如果不會救援 → 😰 資料遺失,專案停擺
會救援技巧 → 😎 5 分鐘內恢復,英雄救美
Git 的安全機制:
好消息:Git 幾乎不會真正刪除資料!
即使你:
在一定時間內(通常 30 天)都可以救回來!
操作步驟
步驟1:理解 Git 的安全網 - Reflog
什麼是 Reflog?
Reflog = Git 的「黑盒子」
記錄所有 HEAD 的移動歷史
就像:
git reflog
git reflog -20
git reflog show main
步驟2:救援誤刪的 Commit
情境1:不小心 reset --hard 了
echo "重要內容" > important.txt
git add important.txt
git commit -m "feat: 重要功能"
git reset --hard HEAD~1
git reflog
git reset --hard a1b2c3d
情境2:刪除了分支
git checkout -b feature/important
echo "開發中..." > work.txt
git add work.txt
git commit -m "feat: 開發中的功能"
git checkout main
git branch -D feature/important
git reflog
git branch feature/important b2c3d4e
git checkout -b feature/important b2c3d4e
步驟3:撤銷錯誤的 Commit
方法1:使用 reset(改寫歷史)
git reset --soft HEAD~1
git reset --mixed HEAD~1
git reset --hard HEAD~1
git reset --soft HEAD~3
方法2:使用 revert(保留歷史)
git revert HEAD
git revert a1b2c3d
git revert HEAD~3..HEAD
git revert -n HEAD
reset vs revert 比較:
git reset:
git revert:
git commit --amend -m "fix: 修正後的訊息"
git commit --amend
加入遺漏的檔案:
echo "補充內容" > forgot.txt
git add forgot.txt
git commit --amend --no-edit
修改作者資訊:
git commit --amend --author="正確名字 email@example.com"
步驟5:救援誤刪的檔案
情境1:檔案還沒 commit
rm important.txt
git restore important.txt
git restore --staged important.txt
git restore important.txt
情境2:檔案已經 commit
git log --all --full-history -- important.txt
git restore --source=a1b2c3d important.txt
git checkout a1b2c3d -- important.txt
情境3:找不到檔案在哪個 commit
git log -S "重要內容" --all
git show a1b2c3d:important.txt
步驟6:處理合併衝突後悔
放棄合併:
git merge feature/branch
git merge --abort
放棄 rebase:
git rebase main
git rebase --abort
步驟7:救援被覆蓋的 Stash
git fsck --unreachable | grep commit | cut -d ' ' -f3 | xargs git log --merges --no-walk --grep=WIP
git show
git branch recovered-stash
常見災難救援指南
災難1:不小心 git push -f
git push -f origin main
git reflog
git reset --hard a1b2c3d
git push -f origin main
災難2:錯誤的 rebase
git rebase main
git reflog
git reset --hard HEAD@{5}
災難3:誤刪整個 .git 資料夾
rm -rf .git
git clone https://github.com/你的帳號/專案.git temp
cp -r temp/.git .
rm -rf temp
災難4:合併了不該合併的東西
git merge feature/bad-branch
git revert -m 1 HEAD
git reset --hard HEAD~1
預防勝於治療
✅ 最佳安全實踐:
git push origin main
git checkout -b experiment
git branch backup-$(date +%Y%m%d)
git clean -fd --dry-run
git status
git log --oneline -5
建立安全習慣:
cat > daily-backup.sh << 'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d)
BRANCH=$(git branch --show-current)
git branch backup-$BRANCH-$DATE
echo "✅ 已建立備份分支: backup-$BRANCH-$DATE"
EOF
chmod +x daily-backup.sh
救援工具箱
常用救援指令速查:
git reflog # 查看操作記錄
git log --all --full-history # 查看完整歷史
git reset --hard # 恢復到指定 commit
git cherry-pick # 撿回特定 commit
git restore # 恢復工作目錄
git restore --staged # 取消暫存
git restore --source= # 從舊版本恢復
git branch # 重建分支
git reset --soft HEAD~1 # 撤銷 commit,保留變更
git reset --hard HEAD~1 # 撤銷 commit,刪除變更
git revert HEAD # 建立反向 commit
git merge --abort # 放棄合併
git rebase --abort # 放棄 rebase
實戰演練
練習1:模擬意外並救援
mkdir git-rescue-practice
cd git-rescue-practice
git init
echo "Version 1" > file.txt
git add file.txt
git commit -m "v1"
echo "Version 2" >> file.txt
git add file.txt
git commit -m "v2"
echo "Version 3" >> file.txt
git add file.txt
git commit -m "v3"
git reset --hard HEAD~2
git reflog
git reset --hard
今日重點回顧
• ✅ 理解 Git 的安全機制(Reflog)
• ✅ 學會救援誤刪的 commit 和分支
• ✅ 掌握撤銷錯誤操作的方法
• ✅ 能夠處理各種災難情況
核心指令總結
git reflog # 查看操作歷史
git reset --hard # 恢復到指定狀態
git restore # 恢復檔案
git branch # 恢復分支
git revert # 安全地撤銷
git commit --amend # 修改最後一次 commit
git merge --abort # 放棄合併
git rebase --abort # 放棄 rebase