34

1 つのローカル ブランチを削除しているときに、このコマンドを誤解して実行していましたが、

git branch -D branch-name

git fetch -p 

しかし、削除されていることが示されているブランチ名のリストを見てきました。

削除されたブランチのリストを見るのが怖くて、間違ったコマンドを実行して、誤ってすべてのブランチを削除してしまったのではないかと思いました!!

このコマンドの意味 ( git fetch -p)。何か案が?

4

4 に答える 4

40

「オリジン」などのリモート リポジトリを取得すると、そのリモート リポジトリに存在する各ブランチのリモート ブランチが取得されます。これらのブランチはローカルに として保存され<remote>/<branch>ます。

したがって、オリジンにはブランチmasterfeatureXおよびがあると仮定しfeatureYます。次に、次の「リモート ブランチ」をフェッチした後、ローカル リポジトリに存在します: origin/masterorigin/featureXおよびorigin/featureY.

ここで、他の誰かがfeatureXmaster にマージし、機能ブランチをリモート リポジトリから削除したとします。次に、オリジンには と の 2 つのブランチしかありませmasterfeatureY

ただし、フェッチすると、リモート リポジトリで削除されたものを含め、3 つのリモート ブランチはすべてまだ存在します。これは、誤ってブランチを失うことを防ぐためです (誰かが誤ってリモートからブランチを削除した場合、そこからフェッチしたすべての人がブランチを失い、復元が困難になると想像してください)。

代わりに、リモート ブランチに存在しなくなったブランチを削除するようにfetchコマンドに指示する必要があります。したがって、実行するgit fetch --prune origingit fetch -p、リモートブランチorigin/featureXも削除されます。

ところで。リモート リポジトリからブランチを削除する場合は、「空の」ブランチをそこにプッシュする必要があります。たとえばgit push origin :branchname、リモート ブランチorigin/branchnameをローカルとリモートの両方で削除します。

于 2013-07-24T11:42:12.957 に答える
15

剪定という意味です

git fetchには、リモート ブランチをプルーニングするオプションがあります。たとえば、次のようになります。

$ git branch -a
develop
master
remotes/origin/HEAD
remotes/origin/develop
remotes/origin/feature/deleted-last-week
remotes/origin/master

ブランチfeature/deleted-last-weekがリモートに存在しなくなった場合 (他の誰かがブランチを削除したため)、実行fetch -pするとブランチへのローカル参照が削除されます。

$ git fetch -p
remote: Counting objects: 751, done.
remote: Compressing objects: 100% (346/346), done.
remote: Total 697 (delta 399), reused 632 (delta 337)
Receiving objects: 100% (697/697), 785.97 KiB | 377 KiB/s, done.
Resolving deltas: 100% (399/399), completed with 27 local objects.
From github.com:AD7six/project
   3ed9793..dece27d  develop    -> origin/develop
   e4b5ae6..94053fd  master     -> origin/master
 x [deleted]         (none)     -> origin/feature/deleted-last-week
$ git branch -a
develop
master
remotes/origin/HEAD
remotes/origin/develop
remotes/origin/master

リモートには存在しないためです。リモートのプルーニングは、 git remote pruneとして明示的に呼び出すこともできます。

于 2013-07-24T11:46:05.083 に答える
8

のヘルプを見てみましたfetchか? git help fetchショー:

-p, --prune
    After fetching, remove any remote-tracking branches which no
    longer exist on the remote.

通常、参照refs/remote/<remote-name>を削除する場合を除いて、新しい参照をフェッチするか、領域に対して更新が行われます。この-pオプションは、リモートに存在しなくなったリモート参照を削除する ようにfetch(および) 要求します。削除されたブランチも削除します。git remote updategit remote prune

たとえば、リモート branch があるとしますfoo。ローカル リポジトリでは、参照 atrefs/remote/origin/fooが保持されます。誰かがfooブランチを削除します。次に を実行するgit fetchとき、参照はそのまま残ります。代わりに実行すると、それが削除されgit fetch -pていることがわかりますrefs/remote/origin/foo

于 2013-07-24T11:47:51.983 に答える