Git 疑難雜症手冊
您在版本控制路上的快速救援指南
基本設定
在開始使用 Git 前,最重要的一步是設定您的使用者名稱和 Email,這會被記錄在每一次的 commit 中。
設定使用者名稱與 Email
這會設定全域的使用者資訊,您所有的 Git 專案都會使用這個設定。
檢查您的設定
您可以檢查目前的設定資訊。
日常操作
這些是您每天都會用到的基本指令。
建立新儲存庫
複製現有儲存庫
查看狀態
檢查工作目錄和暫存區的狀態。
新增檔案到暫存區
新增單一檔案:
新增所有變更的檔案:
提交變更
將暫存區的內容提交到儲存庫。
推送到遠端儲存庫
拉取遠端變更
查看提交歷史
基本的歷史紀錄:
圖形化顯示的歷史紀錄:
還原與重設
當事情出錯時,知道如何安全地回到上一步非常重要。
狀況一:檔案還沒 `git add`
您修改了一個檔案,但想放棄這些修改,回到上次 commit 的狀態。
狀況二:檔案已經 `git add`,但想取消暫存
您不小心把一個檔案加到暫存區了,想把它移出暫存區,但保留檔案的修改。
狀況三:修改最後一次的 commit
剛才的 commit 訊息寫錯了,或是漏加了一個檔案。
1. 如果有漏加的檔案,先 `git add <檔案名稱>`
2. 使用 `–amend` 來修改 commit
警告:如果這個 commit 已經推送到遠端,修改後需要強制推送 (`git push –force`),這可能會影響其他協作者。
狀況四:想完全撤銷某次 commit
這個 commit 根本就不該存在,我想讓它消失。
情境 A:還沒推送到遠端 (比較安全)
這會移除最後一次 commit,並將變更保留在您的工作目錄。
這會徹底刪除最後一次 commit 和所有相關的檔案變更。請小心使用!
情境 B:已經推送到遠端 (建議使用 revert)
在共享的儲存庫中,`reset` 是危險的。`revert` 會建立一個新的 commit 來「反轉」指定的 commit,這是一個更安全的操作。
接著正常 `git push` 即可。
分支管理
分支是 Git 最強大的功能之一,讓您可以平行開發多個功能。
查看所有分支
建立新分支
切換分支
使用 `switch` (建議,較新) 或 `checkout`。
建立並直接切換到新分支
合併分支
將 `feature-branch` 合併到您目前所在的分支 (例如 `main`)。
1. 首先,切換到要接收合併的分支:
2. 執行合併:
刪除分支
刪除已經合併的本地分支:
強制刪除尚未合併的本地分支:
刪除遠端分支:
🚨 緊急救援
當發生嚴重錯誤時,請保持冷靜,這裡有您的解決方案。
狀況一:不小心把 `.env` 或機密檔案 commit 並 push 了!
這是非常嚴重的情況。僅僅是刪除檔案再 commit 一次是不夠的,因為檔案還存在於 Git 的歷史紀錄中。您必須從歷史紀錄中徹底移除它。
第一步:立即在服務端讓金鑰失效!
不論您多快修復 Git,都必須假設金鑰已經外洩。請立刻到 AWS, Google Cloud, GitHub 等平台,停用或更換外洩的 API Key、密碼或憑證。
第二步:從所有歷史紀錄中移除檔案
我們使用 `git filter-branch` 指令。這個指令會重寫您的儲存庫歷史。操作前請先備份您的專案!
請將 `路徑/到/您的/機密檔案` 換成實際的檔案路徑,例如 `config/database.yml` 或 `.env`。
第三步:將檔案加入 `.gitignore`
建立或修改 `.gitignore` 檔案,確保未來不會再意外加入此檔案。
第四步:強制推送到遠端
因為您重寫了歷史,所以需要強制推送。這會覆蓋遠端的歷史紀錄。
警告:這會對所有協作者造成影響。請務必通知所有團隊成員,請他們重新 clone 或使用 `git pull –rebase` 來同步。
狀況二:Commit 到錯誤的分支
假設您在 `main` 分支上做了一個 commit,但它其實應該屬於 `feature` 分支。
1. 確認您在錯誤的分支上 (`main`)。
2. 建立/切換到正確的分支 (`feature`),此時 `feature` 分支也會包含那個錯誤的 commit。
3. 切換回錯誤的分支 (`main`),並移除那個 commit。
現在,該 commit 只存在於 `feature` 分支,`main` 分支則恢復原狀。
狀況三:不小心刪除了分支
別擔心,Git 通常會保留這些紀錄一段時間。`reflog` 是您的好朋友。
1. 使用 `reflog` 找出您刪除分支前的最後一個 commit。
2. 在列表中找到類似 `commit: (some hash) …` 的紀錄,這就是您要找的。複製那個 commit hash。
3. 從那個 commit 重新建立分支。
進階技巧
掌握這些技巧,讓您的 Git 操作更加得心應手。
暫存工作進度 (Stash)
當您正在一個分支上工作,但需要緊急切換到另一個分支修復 bug 時,`stash` 可以暫時儲存您尚未 commit 的修改。
1. 儲存目前的修改:
2. (切換到其他分支做完事後…) 切換回來,並還原儲存的修改:
`pop` 會套用並刪除最近一次的 stash。如果只想套用不刪除,用 `git stash apply`。
挑揀 Commit (Cherry-pick)
想將某個分支的特定一個 commit 複製到目前的分支上。
互動式 Rebase (Interactive Rebase)
一個強大的工具,可以讓您修改、合併、重新排序多個 commit。例如,合併最近 3 個 commit:
執行後會進入一個編輯器,您可以按照指示操作 (例如將 `pick` 改成 `squash` 或 `s` 來合併 commit)。
警告:同樣地,不要對已經推送到共享儲存庫的 commit 進行 rebase。
標籤 (Tag)
常用於標記版本號。
建立一個輕量標籤:
推送所有標籤到遠端: