1 つのローカル ブランチを削除しているときに、このコマンドを誤解して実行していましたが、
git branch -D branch-name
git fetch -p
しかし、削除されていることが示されているブランチ名のリストを見てきました。
削除されたブランチのリストを見るのが怖くて、間違ったコマンドを実行して、誤ってすべてのブランチを削除してしまったのではないかと思いました!!
このコマンドの意味 ( git fetch -p
)。何か案が?
1 つのローカル ブランチを削除しているときに、このコマンドを誤解して実行していましたが、
git branch -D branch-name
git fetch -p
しかし、削除されていることが示されているブランチ名のリストを見てきました。
削除されたブランチのリストを見るのが怖くて、間違ったコマンドを実行して、誤ってすべてのブランチを削除してしまったのではないかと思いました!!
このコマンドの意味 ( git fetch -p
)。何か案が?
「オリジン」などのリモート リポジトリを取得すると、そのリモート リポジトリに存在する各ブランチのリモート ブランチが取得されます。これらのブランチはローカルに として保存され<remote>/<branch>
ます。
したがって、オリジンにはブランチmaster
、featureX
およびがあると仮定しfeatureY
ます。次に、次の「リモート ブランチ」をフェッチした後、ローカル リポジトリに存在します: origin/master
、origin/featureX
およびorigin/featureY
.
ここで、他の誰かがfeatureX
master にマージし、機能ブランチをリモート リポジトリから削除したとします。次に、オリジンには と の 2 つのブランチしかありませmaster
んfeatureY
。
ただし、フェッチすると、リモート リポジトリで削除されたものを含め、3 つのリモート ブランチはすべてまだ存在します。これは、誤ってブランチを失うことを防ぐためです (誰かが誤ってリモートからブランチを削除した場合、そこからフェッチしたすべての人がブランチを失い、復元が困難になると想像してください)。
代わりに、リモート ブランチに存在しなくなったブランチを削除するようにfetchコマンドに指示する必要があります。したがって、実行するgit fetch --prune origin
かgit fetch -p
、リモートブランチorigin/featureX
も削除されます。
ところで。リモート リポジトリからブランチを削除する場合は、「空の」ブランチをそこにプッシュする必要があります。たとえばgit push origin :branchname
、リモート ブランチorigin/branchname
をローカルとリモートの両方で削除します。
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として明示的に呼び出すこともできます。
のヘルプを見てみました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 update
git remote prune
たとえば、リモート branch があるとしますfoo
。ローカル リポジトリでは、参照 atrefs/remote/origin/foo
が保持されます。誰かがfoo
ブランチを削除します。次に を実行するgit fetch
とき、参照はそのまま残ります。代わりに実行すると、それが削除されgit fetch -p
ていることがわかりますrefs/remote/origin/foo
。