1. ホーム
  2. git

[解決済み] git remote prune、git prune、git fetch --pruneなどの違いは何ですか?

2022-03-22 20:12:49

質問内容

同じリポジトリで作業している人が、自分のローカル & リモートリポジトリからブランチを削除してしまったのです...。

Stack Overflow などでこの種の問題について質問している人の多くは、リモートトラッキングのブランチリストにまだブランチが表示されているという問題を抱えています。 git branch -a をクリックしてください。

* 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':

なぜ?

解決方法は?

これでは、イライラするのも無理はないですね。 一番いいのは、こうです。 すべてのリモートブランチには、潜在的に3つのバージョンが存在します。

  1. リモートリポジトリ上の実際のブランチ
    (例: リモートレポ at https://example.com/repo.git , 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 prune は、Git に蓄積されたデータのうち、何からも参照されていないものを削除する方法です。 一般的には、どのブランチの表示にも影響を与えません。

git remote prune origingit fetch --prune の下にある参照に対して操作します。 refs/remotes/... (これらをリモート参照と呼ぶことにします)。 ローカルブランチには影響しません。 そのため git remote バージョンは、特定のリモートの下にあるリモート参照だけを削除したい場合に便利です。 それ以外の場合は、このふたつはまったく同じことをします。 つまり、簡単に言うと git remote prunegit fetch --prune は、上記2番の操作になります。たとえば、git web GUI でブランチを削除し、ローカルのブランチ一覧にはもう表示させないようにする場合 ( git branch -r というコマンドを使用します。

ローカルブランチを削除するには git branch -d (または -D というのは、どこにもマージされていない場合です)。 ちなみに、リモートブランチが消えたときにローカルの追跡用ブランチを自動的に削除するような git コマンドはありません。