今天我們將:
• 整理所有知識點
• 準備面試常見問題
• 給出實戰建議
一、Git 面試常見問題
基礎概念題
Q1: 解釋 Git 和 GitHub 的差別
A:
Git:
GitHub:
類比:
Git 就像 Word(軟體)
GitHub 就像 Google Docs(服務)
Q2: Git 的三個區域是什麼?
A:
Working Directory(工作目錄)
Staging Area(暫存區)
Repository(倉庫)
流程:
編輯 → git add → Staging → git commit → Repository
Q3: 什麼是 commit?
A:
Commit 是專案某個時間點的快照
包含:
好的 commit:
通常情況:
HEAD → 分支 → commit
例:HEAD → main → abc123
Detached HEAD:
HEAD 直接指向某個 commit
發生於:git checkout
檢查:
cat .git/HEAD
分支與合併題
Q5: 解釋 merge 和 rebase 的差別
A:
Merge:
Rebase:
使用時機:
Merge:合併公開分支(main, develop)
Rebase:整理自己的 feature 分支
黃金法則:
永遠不要 rebase 已推送的公開分支!
Q6: Fast-forward merge 是什麼?
A:
當目標分支沒有新的 commits 時發生
範例:
main: A - B
feature: B - C - D
merge 後:
main: A - B - C - D(只是移動指標)
沒有產生 merge commit,直接快轉
禁用:
git merge --no-ff feature
強制產生 merge commit,保留分支歷史
Q7: 如何解決 merge 衝突?
A:
步驟:
預防:
協作與遠端題
Q8: git pull 和 git fetch 的差別?
A:
git fetch:
git pull:
建議:
使用 git fetch 後檢查
確認沒問題再 merge
Q9: 什麼時候用 git push --force?
A:
⚠️ 非常危險的操作!
可以用的情況:
✅ 自己的 feature 分支
✅ 整理完歷史後
✅ 確定沒有其他人在用
絕對不要:
❌ 公開分支(main, develop)
❌ 團隊共用的分支
更安全的替代:
git push --force-with-lease
(會檢查遠端是否被更新)
Q10: 什麼是 Pull Request?
A:
Pull Request(PR):
PR 的好處:
流程:
進階題
Q11: 解釋 git reset 的三種模式
A:
--soft
只移動 HEAD
變更留在 Staging Area
用途:重新 commit
--mixed(預設)
移動 HEAD + 重設 Staging
變更留在 Working Directory
用途:取消 git add
--hard
移動 HEAD + 重設 Staging + Working
變更完全消失
用途:完全回到某個狀態
範例:
git reset --soft HEAD~1 # 撤銷 commit,保留變更
git reset HEAD~1 # 撤銷 commit 和 add
git reset --hard HEAD~1 # 完全刪除最後 commit
Q12: 如何找回誤刪的 commit?
A:
使用 git reflog
步驟:
git reflog
查看所有 HEAD 移動記錄
找到誤刪前的 commit hash
例:abc123 HEAD@{2}: commit: 重要功能
恢復
git reset --hard abc123
或
git cherry-pick abc123
Reflog 保留時間:
預設 90 天
可設定:git config gc.reflogExpire "180 days"
Q13: cherry-pick 的用途?
A:
Cherry-pick:
複製某個 commit 到當前分支
使用場景:
Hotfix 需要套用到多個分支
git checkout release/v1.0
git cherry-pick
只要某個功能的部分 commits
git cherry-pick commit-A commit-C
從錯誤分支救回 commit
git checkout correct-branch
git cherry-pick
注意:
產生新的 commit(不同 hash)
可能產生衝突
Q14: stash 的使用時機?
A:
Stash 暫存未完成的工作
使用時機:
常用指令:
git stash push -u -m "描述" # 暫存(包含新檔案)
git stash list # 查看列表
git stash pop # 恢復並刪除
git stash apply # 恢復但保留
技巧:
可以有多個 stash
可以在不同分支 pop
Q15: 如何寫好 commit 訊息?
A:
Conventional Commits 格式:
():
Type:
範例:
feat(auth): 新增 Google 登入功能
實作 OAuth 2.0 整合,使用者可以用 Google 帳號登入。
Closes #123
要點:
二、實戰情境題
情境 1:多人同時修改同一檔案
面試官:
團隊三個人同時修改 config.js,如何避免衝突?
你的回答:
預防策略:
技術策略:
流程策略:
發生衝突時:
你的回答:
緊急處理流程:
git checkout main
git pull origin main
git checkout -b hotfix/critical-bug
快速修復:
修改程式碼
本地測試
git commit -m "hotfix: 修復關鍵 bug"
部署流程:
git push origin hotfix/critical-bug
建立緊急 PR
快速 Review(但不能省略)
合併到 main
自動部署(CI/CD)
同步到其他分支:
git checkout develop
git cherry-pick
事後處理:
你的回答:
情況 1:還沒 push
git branch feature/my-work # 保存到新分支
git reset --hard HEAD~1 # main 回退
git checkout feature/my-work # 繼續工作
情況 2:已經 push(更麻煩)
方法 A:Revert(推薦)
git revert HEAD
git push origin main
在 feature 分支繼續開發
方法 B:Reset + Force Push(危險)
⚠️ 只在確定沒有其他人 pull 時使用
git reset --hard HEAD~1
git push --force-with-lease origin main
通知所有團隊成員
教訓:
三、行為面試題
團隊協作
Q: 描述一次你在團隊中使用 Git 協作的經驗
好的回答架構(STAR):
Situation(情境):
我們團隊 5 個人開發一個電商網站...
Task(任務):
我負責購物車功能,需要與付款模組整合...
Action(行動):
Result(結果):
學到什麼:
範例回答:
問題:
團隊成員誤用 git push --force 覆蓋了 main 分支,
導致 20 個 commits 消失。
解決過程:
預防措施:
反思:
四、30 天學習總結
第一週:Git 基礎(Day 1-7)
✅ 掌握的技能:
核心概念:
核心概念:
核心概念:
核心概念:
五、知識地圖
Git 技能樹:
Level 1 - 基礎(必備)
├── init, clone
├── add, commit, push, pull
├── status, log, diff
└── .gitignore
Level 2 - 分支(重要)
├── branch, checkout, switch
├── merge, rebase
├── 衝突解決
└── stash
Level 3 - 協作(專業)
├── remote(add, remove, rename)
├── fetch vs pull
├── Pull Request
└── Code Review
Level 4 - 進階(大師)
├── reset, revert, cherry-pick
├── reflog
├── interactive rebase
├── Git Flow
└── CI/CD 整合
Level 5 - 專精(專家)
├── Git 內部原理
├── 效能優化
├── 自訂 hooks
├── 複雜問題解決
└── 團隊流程設計
六、下一步學習建議
鞏固基礎(1-2 週)
□ 每天使用 Git(養成習慣)
□ 建立 3-5 個完整專案
□ 練習所有常用指令
□ 嘗試解決各種問題情境
□ 寫技術筆記
提升協作(1 個月)
□ 參與開源專案(提交 PR)
□ 與他人協作開發
□ 進行 Code Review
□ 建立團隊工作流程
□ 設定 CI/CD
深入進階(持續)
□ 學習 Git 內部原理
□ 研究大型專案的工作流程
□ 優化團隊協作效率
□ 自動化流程設計
□ 分享知識(寫文章、教學)
推薦資源
書籍:
網站:
練習:
七、實戰檢查清單
日常開發
□ 開始工作前 git pull
□ 頻繁 commit(小步前進)
□ 寫清楚的 commit 訊息
□ 定期推送到遠端
□ Code Review 認真參與
□ 遇到問題先 Google
□ 重要操作前先備份分支
專案管理
□ README 完整清楚
□ .gitignore 設定正確
□ 有明確的分支策略
□ 設定分支保護規則
□ CI/CD 自動化
□ 定期清理舊分支
□ 標籤標記重要版本
團隊協作
□ 溝通大於技術
□ 尊重 Code Review 意見
□ 及時回應 PR 和 Issues
□ 文件保持更新
□ 分享知識和經驗
□ 互相幫助學習
八、最後的挑戰
□ 初級挑戰
□ 建立一個專案並推送到 GitHub
□ 建立分支並合併
□ 解決一次 merge 衝突
□ 寫出好的 commit 訊息
□ 完成一個 Pull Request
□ 中級挑戰
□ 使用 rebase 整理 commits
□ 使用 stash 處理緊急修復
□ 從 reflog 救回誤刪的 commit
□ 設定 GitHub Actions CI/CD
□ 完成 Code Review
□ 高級挑戰
□ 貢獻開源專案(提交 PR)
□ 建立完整的作品集(3+ 專案)
□ 優化 GitHub Profile
□ 幫助他人解決 Git 問題
□ 寫一篇 Git 技術文章