420

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

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

なんで?

4

4 に答える 4

783

私はあなたがこれについてイライラしたことを責めません。これを見るのに最適な方法です。すべてのリモート ブランチには、潜在的に 3 つのバージョンがあります。

  1. リモート リポジトリの実際のブランチ
    (例: 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、そのブランチの履歴を表すいくつかのオブジェクトを参照する ref という名前が付けられています。したがって、定義により、git pruneは削除されませんrandom_branch_I_want_deleted。本当に、git pruneGit に蓄積されているが、何からも参照されていないデータを削除する方法です。一般に、ブランチのビューには影響しません。

git remote prune origingit fetch --pruneどちらも下の参照で動作しますrefs/remotes/...(これらをリモート参照と呼びます) 。ローカル ブランチには影響しません。このgit remoteバージョンは、特定のリモートでのリモート参照のみを削除する場合に役立ちます。それ以外の場合、2 つはまったく同じことを行います。つまり、要するに、上記の2番git remote prunegit fetch --prune操作します。たとえば、git web GUI を使用してブランチを削除し、それをローカル ブランチ リストに表示したくない場合 ( git branch -r)、このコマンドを使用する必要があります。

ローカル ブランチを削除するには、git branch -d(または-Dどこにもマージされていない場合) を使用する必要があります。FWIW、リモート ブランチが消えた場合にローカル トラッキング ブランチを自動的に削除する git コマンドはありません。

于 2013-11-20T21:14:58.620 に答える
69

git remote pruneあなたが言ったように、リモートに存在しgit fetch --pruneないブランチへの参照を削除します。2 番目のコマンドはリモートに接続し、プルーニングの前に現在のブランチをフェッチします。

ただし、チェックアウトしたローカルブランチには触れないため、単純に削除できます

git branch -d  random_branch_I_want_deleted

ブランチが他の場所にマージされていない場合に-d置き換えます-D

git prune到達不能なオブジェクト、つまり、どのブランチまたはタグでも到達できず、したがって不要になったコミットをパージします。

于 2013-11-20T21:04:25.987 に答える
13

git remote --pruneとの間の 1 つの違いはコミット 10a6cc8git fetch --prune修正されていることに注意してください。tmiller

frotz/nitfol以前のフェッチから" " という名前のリモート追跡ブランチがあり、アップストリームに "**frotz "**という名前のブランチがある場合、アップストリームから" " を含む " "fetchを削除できません。git は、ユーザーに " " を使用して問題を解決する よう通知します。frotz/nitfolgit fetch --prune
git remote prune

したがって、上流のレポにブランチ階層(「frotz/xxx」、可能性のあるブランチ命名規則)と同じ名前のブランチ (「frotz」) がある場合、 git remote --prune(レポからリモート追跡ブランチをクリーンアップする際に) 成功していました。 、しかしgit fetch --prune失敗していました。

もう違います:

fetch --pruneプルーニング操作をフェッチ操作の前に移動して、「 」の動作方法を変更します。
このようにして、ユーザーに競合を警告する代わりに、自動的に修正します。

于 2014-01-12T08:55:57.610 に答える