2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

git worktree add が「a branch named ... already exists」で失敗。原因は、前回マージ済みなのに残っていたブランチでした

2
Posted at

個人で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 に置いています。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?