Git 疑難雜症手冊

Git 疑難雜症手冊

Git 疑難雜症手冊

您在版本控制路上的快速救援指南

基本設定

在開始使用 Git 前,最重要的一步是設定您的使用者名稱和 Email,這會被記錄在每一次的 commit 中。

設定使用者名稱與 Email

這會設定全域的使用者資訊,您所有的 Git 專案都會使用這個設定。

git config –global user.name “您的名字”
git config –global user.email “your.email@example.com”

檢查您的設定

您可以檢查目前的設定資訊。

git config –list

日常操作

這些是您每天都會用到的基本指令。

建立新儲存庫

git init

複製現有儲存庫

git clone [url]

查看狀態

檢查工作目錄和暫存區的狀態。

git status

新增檔案到暫存區

新增單一檔案:

git add <檔案名稱>

新增所有變更的檔案:

git add .

提交變更

將暫存區的內容提交到儲存庫。

git commit -m “您的提交訊息”

推送到遠端儲存庫

git push origin <分支名稱>

拉取遠端變更

git pull origin <分支名稱>

查看提交歷史

基本的歷史紀錄:

git log

圖形化顯示的歷史紀錄:

git log –graph –oneline –decorate –all

還原與重設

當事情出錯時,知道如何安全地回到上一步非常重要。

狀況一:檔案還沒 `git add`

您修改了一個檔案,但想放棄這些修改,回到上次 commit 的狀態。

git restore <檔案名稱>

狀況二:檔案已經 `git add`,但想取消暫存

您不小心把一個檔案加到暫存區了,想把它移出暫存區,但保留檔案的修改。

git restore –staged <檔案名稱>

狀況三:修改最後一次的 commit

剛才的 commit 訊息寫錯了,或是漏加了一個檔案。

1. 如果有漏加的檔案,先 `git add <檔案名稱>`

2. 使用 `–amend` 來修改 commit

git commit –amend –no-edit # 不修改訊息,僅加入新檔案 git commit –amend # 會開啟編輯器讓您修改訊息

警告:如果這個 commit 已經推送到遠端,修改後需要強制推送 (`git push –force`),這可能會影響其他協作者。

狀況四:想完全撤銷某次 commit

這個 commit 根本就不該存在,我想讓它消失。

情境 A:還沒推送到遠端 (比較安全)

這會移除最後一次 commit,並將變更保留在您的工作目錄。

git reset –soft HEAD~1

這會徹底刪除最後一次 commit 和所有相關的檔案變更。請小心使用!

git reset –hard HEAD~1

情境 B:已經推送到遠端 (建議使用 revert)

在共享的儲存庫中,`reset` 是危險的。`revert` 會建立一個新的 commit 來「反轉」指定的 commit,這是一個更安全的操作。

git revert <要撤銷的 commit hash>

接著正常 `git push` 即可。

分支管理

分支是 Git 最強大的功能之一,讓您可以平行開發多個功能。

查看所有分支

git branch

建立新分支

git branch <新分支名稱>

切換分支

使用 `switch` (建議,較新) 或 `checkout`。

git switch <分支名稱>

建立並直接切換到新分支

git switch -c <新分支名稱>

合併分支

將 `feature-branch` 合併到您目前所在的分支 (例如 `main`)。

1. 首先,切換到要接收合併的分支:

git switch main

2. 執行合併:

git merge feature-branch

刪除分支

刪除已經合併的本地分支:

git branch -d <分支名稱>

強制刪除尚未合併的本地分支:

git branch -D <分支名稱>

刪除遠端分支:

git push origin –delete <分支名稱>

🚨 緊急救援

當發生嚴重錯誤時,請保持冷靜,這裡有您的解決方案。

狀況一:不小心把 `.env` 或機密檔案 commit 並 push 了!

這是非常嚴重的情況。僅僅是刪除檔案再 commit 一次是不夠的,因為檔案還存在於 Git 的歷史紀錄中。您必須從歷史紀錄中徹底移除它。

第一步:立即在服務端讓金鑰失效!

不論您多快修復 Git,都必須假設金鑰已經外洩。請立刻到 AWS, Google Cloud, GitHub 等平台,停用或更換外洩的 API Key、密碼或憑證。

第二步:從所有歷史紀錄中移除檔案

我們使用 `git filter-branch` 指令。這個指令會重寫您的儲存庫歷史。操作前請先備份您的專案!

git filter-branch –force –index-filter \ ‘git rm –cached –ignore-unmatch 路徑/到/您的/機密檔案’ \ –prune-empty –tag-name-filter cat — –all

請將 `路徑/到/您的/機密檔案` 換成實際的檔案路徑,例如 `config/database.yml` 或 `.env`。

第三步:將檔案加入 `.gitignore`

建立或修改 `.gitignore` 檔案,確保未來不會再意外加入此檔案。

echo “路徑/到/您的/機密檔案” >> .gitignore git add .gitignore git commit -m “Add sensitive file to .gitignore”

第四步:強制推送到遠端

因為您重寫了歷史,所以需要強制推送。這會覆蓋遠端的歷史紀錄。

警告:這會對所有協作者造成影響。請務必通知所有團隊成員,請他們重新 clone 或使用 `git pull –rebase` 來同步。

git push origin –force –all

狀況二:Commit 到錯誤的分支

假設您在 `main` 分支上做了一個 commit,但它其實應該屬於 `feature` 分支。

1. 確認您在錯誤的分支上 (`main`)。

2. 建立/切換到正確的分支 (`feature`),此時 `feature` 分支也會包含那個錯誤的 commit。

git switch -c feature # 如果 feature 不存在 # 或 git switch feature # 如果 feature 已存在 git merge main # 將 main 的進度(包含錯誤的commit)同步過來

3. 切換回錯誤的分支 (`main`),並移除那個 commit。

git switch main git reset –hard HEAD~1

現在,該 commit 只存在於 `feature` 分支,`main` 分支則恢復原狀。

狀況三:不小心刪除了分支

別擔心,Git 通常會保留這些紀錄一段時間。`reflog` 是您的好朋友。

1. 使用 `reflog` 找出您刪除分支前的最後一個 commit。

git reflog

2. 在列表中找到類似 `commit: (some hash) …` 的紀錄,這就是您要找的。複製那個 commit hash。

3. 從那個 commit 重新建立分支。

git branch <舊分支名稱>

進階技巧

掌握這些技巧,讓您的 Git 操作更加得心應手。

暫存工作進度 (Stash)

當您正在一個分支上工作,但需要緊急切換到另一個分支修復 bug 時,`stash` 可以暫時儲存您尚未 commit 的修改。

1. 儲存目前的修改:

git stash

2. (切換到其他分支做完事後…) 切換回來,並還原儲存的修改:

git stash pop

`pop` 會套用並刪除最近一次的 stash。如果只想套用不刪除,用 `git stash apply`。

挑揀 Commit (Cherry-pick)

想將某個分支的特定一個 commit 複製到目前的分支上。

git cherry-pick

互動式 Rebase (Interactive Rebase)

一個強大的工具,可以讓您修改、合併、重新排序多個 commit。例如,合併最近 3 個 commit:

git rebase -i HEAD~3

執行後會進入一個編輯器,您可以按照指示操作 (例如將 `pick` 改成 `squash` 或 `s` 來合併 commit)。

警告:同樣地,不要對已經推送到共享儲存庫的 commit 進行 rebase。

標籤 (Tag)

常用於標記版本號。

建立一個輕量標籤:

git tag v1.0.0

推送所有標籤到遠端:

git push –tags
分類: Uncategorized。這篇內容的永久連結

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *