git で `/` で区切るブランチ名がリモートで作られた時に pull できなかった
前提
git では、ブランチ名にスラッシュを使うことでネストっぽく扱うことができます
たとえば git switch -c issue-1/hoge
とブランチを作った時 SourceTree や JetBrains IDE の Git クライアントなどでは issue-1
がディレクトリのようになり、その中に hoge
がいるような扱いができます
(この機能に名前はあるんですかね?)
この時、後から git switch -c issue-1
は失敗します
すでにネストされた名前があるので作成できないよ、というエラーになります
❯ git switch -c issue-1
fatal: cannot lock ref 'refs/heads/issue-1': 'refs/heads/issue-1/hoge' exists; cannot create 'refs/heads/issue-1'
なので、ネストする場合は親の名前をブランチ名に付けないように運用する必要があります
本題
チームメンバーがとあるタスクを進めています。彼は最初 feature/hogehoge
というブランチで作業していました
彼の作業を一度コードを見る必要があったので、そのブランチを pull していました
どうやら作業量が多いため、作業ブランチを細かく切るように変えたようです
彼は feature/hogehoge
をローカル/リモートから削除し feature/hogehoge/fugafuga
というブランチを作り push したようです
この時、ぼくのローカルには feature/hogehoge
が残っています
で、彼の作業とはまったく関係無い、自分の作業ブランチを pull しようとしたところ、次のようなエラーが発生しました
error: cannot lock ref 'refs/remotes/origin/feature/hogehoge/fugafuga': 'refs/remotes/origin/feature/hogehoge' exists; cannot create 'refs/remotes/origin/feature/hogehoge/fugafuga'
From github.com:chatii/hoge-repo
! [new branch] feature/hogehoge/fugafuga -> origin/feature/hogehoge/fugafuga (unable to update local ref)
error: some local refs could not be updated; try running
'git remote prune origin' to remove any old, conflicting branches
当然と言えば当然ですが、なるほど
git が最後に教えてくれたコマンド git remote prune origin
を実行すると、リモートリポジトリにはすでに無いブランチをローカルから消してくれました
git remote prune
をはじめて見たので記事に
Discussion