git remote prune、git prune、git fetch --pruneなどの違いは何ですか?質問する

git remote prune、git prune、git fetch --pruneなどの違いは何ですか?質問する

私の状況はこうです...同じリポジトリで作業している誰かが、ローカルおよびリモート リポジトリからブランチを削除しました...

git branch -aStack 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 つのバージョンがあります。

  1. リモートリポジトリの実際のブランチ
    (例:リポジトリrefs/heads/master
  2. そのブランチのスナップショットはローカルに保存されます( に保存されますrefs/remotes/...
    (例:ローカルリポジトリ、refs/remotes/origin/master
  3. そして、リモートブランチを追跡している可能性のあるローカルブランチ
    (例:ローカルリポジトリrefs/heads/master

まず から始めましょうgit prune。これは、参照されなくなったオブジェクトrandom_branch_I_want_deletedを削除しますが、参照を削除するわけではありません。あなたの場合、ローカル ブランチがあります。つまり、そのブランチの履歴を表すいくつかのオブジェクトを参照する という名前の参照があります。したがって、定義上、git pruneは を削除しませんrandom_branch_I_want_deleted。実際、 は、git pruneGit に蓄積されているが、何からも参照されていないデータを削除する方法です。一般に、どのブランチの表示にも影響しません。

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 コマンドはありません。

おすすめ記事