個人でWebサイトやアプリを作っています(屋号は sesebox です)。
ひとつのGitリポジトリに複数のアプリを入れていて、アプリごとに作業用のフォルダを分けて並行作業するために git worktree を使っています。ある朝、いつも通りに作業用フォルダを作ろうとしたら、こんなエラーで止まりました。
Preparing worktree (new branch 'track/gakko-loop')
fatal: a branch named 'track/gakko-loop' already exists
「その名前のブランチは、もうあります」というエラーです。原因と直し方を書いておきます。
そもそも git worktree とは
ふつう、Gitのリポジトリでブランチを切り替えると、同じフォルダの中身が入れ替わります。作業の途中で別のブランチに移りたいときは、いったん保存(コミットや退避)してから切り替える必要があります。
git worktree を使うと、同じリポジトリの別のブランチを、別のフォルダに同時に取り出せます。
git worktree add ../tracks/gakko-loop -b track/gakko-loop
-
../tracks/gakko-loop… 新しく作る作業フォルダ -
-b track/gakko-loop… その作業フォルダで使う新しいブランチを作る
私は、アプリごとに作業を分けたいので、これで「アプリ専用の作業フォルダ」を作っています。
エラーの原因:前回のブランチが残っていた
-b は「新しいブランチを作る」という意味なので、同じ名前のブランチがすでにあると失敗します。
前日にこの作業フォルダを片づけたときに、フォルダ(worktree)は消したのに、ブランチは残っていたのが原因でした。
確認するコマンドはこの2つです。
# ブランチの一覧(残っているか見る)
git branch --list "track/*"
# いま開いている作業フォルダの一覧
git worktree list
track/gakko-loop ← ブランチだけ残っている
C:/claude_project/claude_campany e8beed83 [main]
← gakko-loop の作業フォルダは無い
ブランチだけ残っていて、作業フォルダは無い状態でした。
消していいか確かめる:マージ済みか見る
ブランチを消す前に、中身がすでにmainに入っているかを確かめます。入っていない変更を消してしまうと、戻せなくなるからです。
# main にまだ入っていないコミットを表示する
git log --oneline main..track/gakko-loop
何も表示されなければ、そのブランチの変更は全部mainに入っています。今回は何も出なかったので、消して問題ありませんでした。
消す:小文字の -d を使う
git branch -d track/gakko-loop
Deleted branch track/gakko-loop (was 3c68901d).
ここで -d(小文字)を使うのがポイントです。
| 動き | |
|---|---|
git branch -d |
マージ済みのブランチだけ消す。未マージなら止めてくれる |
git branch -D(大文字) |
マージされていなくても強制で消す |
小文字の -d なら、うっかり未マージのものを消そうとしても止まります。確認用の安全装置として使えます。 大文字の -D は、消えても困らないと確信しているときだけにしています。
その後、同じコマンドで作業フォルダを作り直せました。
git worktree add ../tracks/gakko-loop -b track/gakko-loop
git worktree list
片づけるときは、ブランチもセットで
作業が終わって片づけるときは、次の2つをセットでやるのが安全でした。
git worktree remove ../tracks/gakko-loop # 作業フォルダを消す
git branch -d track/gakko-loop # マージ済みなら、ブランチも消す
フォルダだけ消してブランチを残すと、次に同じ名前で作るときに、今回のエラーになります。
まとめ
-
a branch named ... already existsは、同じ名前のブランチがすでにあるというエラー -
git branch --listとgit worktree listで、ブランチだけ残っていないか見る - 消す前に
git log main..<ブランチ名>で、マージ済みかを確認する - 消すときは小文字の
-d(マージ済みだけ消える) - 作業フォルダを片づけるときは、ブランチもセットで消す
アプリごとに作業を分けているので、片づけの手順に「ブランチを消す」を1行足しておきました。
作っているものの一覧は sesebox.dev に置いています。