私の状況はこうです...同じリポジトリで作業している誰かが、ローカルおよびリモート リポジトリからブランチを削除しました...
git branch -a
Stack Overflow や他のサイトでこの種の問題について質問した人のほとんどは、リモート追跡ブランチ リストの下部にブランチがまだ表示されるという問題を抱えています。
* master
develop
feature_blah
remotes/origin/master
remotes/origin/develop
remotes/origin/feature_blah
remotes/origin/random_branch_I_want_deleted
しかし、私の状況では、そこに存在すべきではないブランチはローカルにあります。
* master
develop
feature_blah
random_branch_I_want_deleted
remotes/origin/master
remotes/origin/develop
remotes/origin/feature_blah
次のいずれかを実行しても、ローカルでは削除されません。
$ git prune
私も試しました:
$ git remote prune origin
$ git fetch --prune
さらに役立つ情報: 確認するとgit remote show origin
次のようになります:
* remote origin
Fetch URL: utilities:homeconnections_ui.git
Push URL: utilities:homeconnections_ui.git
HEAD branch: master
Remote branches:
master tracked
develop tracked
feature_blah tracked
other123 tracked
other444 tracked
other999 tracked
Local branches configured for 'git pull':
develop merges with remote develop
feature_blah merges with remote other999
master merges with remote master
random_branch_I_want_deleted merges with remote random_branch_I_want_deleted
Local refs configured for 'git push':
develop pushes to develop (local out of date)
master pushes to master (up to date)
feature_blah pushes to feature_blah(up to date)
というタイトルのセクションにのみ記載されています。Local branches configured for 'git pull':
なぜ?
ベストアンサー1
これについてイライラするのは仕方ありません。最も良い見方はこうです。すべてのリモート ブランチには潜在的に 3 つのバージョンがあります。
- リモートリポジトリの実際のブランチ
(例:リポジトリ、refs/heads/master
) - そのブランチのスナップショットはローカルに保存されます( に保存されます
refs/remotes/...
)
(例:ローカルリポジトリ、refs/remotes/origin/master
) - そして、リモートブランチを追跡している可能性のあるローカルブランチ
(例:ローカルリポジトリrefs/heads/master
)
まず から始めましょうgit prune
。これは、参照されなくなったオブジェクトrandom_branch_I_want_deleted
を削除しますが、参照を削除するわけではありません。あなたの場合、ローカル ブランチがあります。つまり、そのブランチの履歴を表すいくつかのオブジェクトを参照する という名前の参照があります。したがって、定義上、git prune
は を削除しませんrandom_branch_I_want_deleted
。実際、 は、git prune
Git に蓄積されているが、何からも参照されていないデータを削除する方法です。一般に、どのブランチの表示にも影響しません。
git remote prune origin
と はgit fetch --prune
両方とも の下の参照を操作しますrefs/remotes/...
(これらをリモート参照と呼びます)。ローカル ブランチには影響しません。 このgit remote
バージョンは、特定のリモートの下のリモート参照のみを削除したい場合に便利です。 それ以外の場合、2 つはまったく同じことを行います。 つまり、簡単に言うと、git remote prune
と はgit fetch --prune
上記の 2 番を操作します。 たとえば、git Web GUI を使用してブランチを削除し、ローカル ブランチ リスト ( ) にそのブランチを表示したくない場合はgit branch -r
、このコマンドを使用する必要があります。
ローカル ブランチを削除するには、git branch -d
(または、-D
どこにもマージされていない場合) を使用する必要があります。参考までに、リモート ブランチが消えた場合にローカル追跡ブランチを自動的に削除する git コマンドはありません。