Git 分支已被另一個目錄使用:用 worktree 保留原來的修改

想在另一個資料夾修網站頁首,執行 git worktree add ../site-copy main 卻看到 main 已被使用的錯誤。這通常不是資料夾權限問題:同一個儲存庫的 main 已在某個工作樹中檢出,Git 預設不讓兩個工作樹同時使用同一條分支。

如果原本的網站目錄還有修改沒做完,不必先清空它。先找出分支在哪個目錄,再決定回去繼續工作,或從指定提交建立另一條修正分支。以下適用已使用 Git 的網站專案;worktree 不會替你部署網站,也不會自動安裝相依套件。

先找出 main 在哪裡,不要只看當前資料夾

在儲存庫的任一工作樹執行:

git worktree list

假設看到以下內容,表示 main 正在 site 目錄使用。實際路徑與提交縮寫會依你的專案而不同:

/projects/site  a1b2c3d [main]

此時再要求一個新目錄檢出 main,Git 會拒絕。若你本來就要改 main,先進入清單中那個目錄,查看 git status --short --branch,確認已有的修改和負責人,再接著處理;不要因為新目錄建立失敗,就把舊目錄刪掉。

要並行修頁首,就建立新分支與新工作樹

如果希望保留原目錄的工作,另開一個修正,先在預定的起點查看目前提交,再建立新工作樹。下面使用尚未存在的目錄名稱與分支名稱:

git log -1 --oneline
git worktree add -b fix/header ../site-header-fix HEAD
git -C ../site-header-fix status --short --branch
git worktree list

-b fix/header 建立新分支;../site-header-fix 是新目錄;最後的 HEAD 表示從目前工作樹檢出的提交開始。HEAD 不代表遠端最新版本,也不代表原目錄裡尚未提交的檔案內容。若需要從另一個已核對的提交開始,應先確認那個提交,再替換最後的起點。

成功後,新目錄的狀態應顯示 fix/header,清單也會多出該路徑。若分支或目錄已存在,先查它是否就是你要接續的工作,或選另一個新名稱;不要用 -B 把既有分支重設成範例起點。

原目錄的未提交修改不會跟過去

例如,main 的 index.html 已改成新頁首但還沒提交,而 HEAD 裡仍是舊頁首。用上述指令建立工作樹後,新目錄會拿到已提交的舊頁首;原目錄的未提交修改仍留在原處。這正是需要分清「從提交建立」與「複製目前資料夾」的地方。

兩個工作樹各有自己的 HEAD、暫存區與工作檔案,但共享儲存庫的物件與一般分支參照。因此它適合並行處理不同分支,不能當成完全獨立的備份。新目錄沒有自動帶入被 Git 忽略的本機設定、上傳檔或安裝好的套件,也不要為了讓測試能跑,就直接把正式環境的密鑰複製進版本控制。

不要先用 force 繞過分支保護

git worktree add 的 force 選項可以放寬部分檢查,但讓同一條分支同時出現在兩個目錄,會增加判斷目前提交與工作狀態的負擔。一般頁面修正先使用不同分支即可,不需要靠強制參數解決。

若清單指向已搬走或暫時無法存取的路徑,先確認那份工作是否還存在,別把「目前看不到目錄」直接當成「可以清掉登記」。新工作樹建好後,回到原目錄再看一次狀態,確認未提交修改仍在;最後提交、合併、推送及部署是另外的步驟,建立工作樹本身不會替你完成。

參考資料

原文鏈接:https://wntheme.com/git-worktree-branch-already-checked-out/,轉載請註明出處。
0
顯示驗證碼
沒有帳號?註冊  忘記密碼?