📁

git で `/` で区切るブランチ名がリモートで作られた時に pull できなかった

2021/08/16に公開

前提

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 をはじめて見たので記事に

https://git-scm.com/docs/git-remote#Documentation/git-remote.txt-empruneem

Discussion