Что означает "git fetch -p"
Я выполнил эту команду с недоразумениями, когда я удалял одну локальную ветвь,
git branch -D branch-name
git fetch -p
но я видел, что это список имен ветвей, которые отображаются для удаления.
Я боялся увидеть список удаленных веток, и, возможно, подумал, что я выполнил неправильную команду и случайно удалил все ветки!!
Что означает эта команда (git fetch -p
). Есть идеи?
Ответы
Ответ 1
Когда вы извлекаете удаленный репозиторий, скажем "origin", вы получите удаленные ветки для каждой ветки, которая существует в этом удаленном репозитории. Эти ветки локально хранятся как <remote>/<branch>
.
Предположим, что у начала есть ветки master
, featureX
и featureY
. Затем после извлечения в вашем локальном репозитории существуют следующие "удаленные ветки": origin/master
, origin/featureX
и origin/featureY
.
Теперь представьте, что кто-то еще объединяет featureX
в master и удаляет ветвь функции из удаленного репозитория. Тогда у начала только две ветки master
и featureY
.
Однако при извлечении три удаленных ветки все еще будут существовать, включая ту, которая была удалена в удаленном репозитории. Это должно помешать вам случайно потерять ветку (предположите, что кто-то случайно удалил ветку с пульта, тогда все, кто извлек ее из нее, тоже потеряют ее, что затруднит ее восстановление).
Вместо этого вам нужно будет сообщить команде fetch обрезать любые ветки, которые больше не существуют в удаленной ветке. Таким образом, выполнив git fetch --prune origin
или git fetch -p
удаленная ветвь origin/featureX
также будет удалена.
Btw. если вы хотите удалить ветку из удаленного репозитория, вам придется нажать на нее "пустую" ветвь, например. git push origin :branchname
удалит удаленную ветвь origin/branchname
как локально, так и на самом удаленном устройстве.
Ответ 2
Это означает сокращение
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
nolonger существует на удаленном компьютере (поскольку кто-то еще удалил ее уже), запуск 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 удаленная обрезка.
Ответ 3
Вы пытались найти помощь для 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
также удалит удаленные ветки.
Например, скажем, имеется удаленная ветвь foo
. В вашем локальном хранилище сохраняется ссылка в refs/remote/origin/foo
. Кто-то удаляет ветвь foo
. В следующий раз, когда вы запустите git fetch
, ваша ссылка останется неповрежденной. Если вы запустите git fetch -p
, вы увидите, что refs/remote/origin/foo
удален.
Ответ 4
Другие ответы объясняют, что делает git fetch --prune
, но есть один случай, когда он должен быть немного точнее: когда нет ничего, чтобы извлечь (без новых ссылок) из upstream repo.
В этом случае он обрезает ветки удаленных отслеживаний (от /remotes/anUpstreamRepo/*
), но не сказал, что причиной восходящего репо была причина указанной обрезки.
Это фиксируется commit 4b3b33a Том Миллер (tmiller ) для git 1.9/2.0 (Q1 2014):
fetch --prune
: всегда печатать заголовок URL
Если "fetch --prune
" запускается без новых ссылок для извлечения, но у него есть ссылки для обрезки. Затем URL-адрес заголовка не печатается, как если бы были новые refs для извлечения.
Вывод перед этим патчем:
$ git fetch --prune remote-with-no-new-refs
x [deleted] (none) -> origin/world
Результат после этого патча:
$ git fetch --prune remote-with-no-new-refs
From https://github.com/git/git
x [deleted] (none) -> origin/test