Подтвердить что ты не робот

Что означает "git fetch -p"

Я выполнил эту команду с недоразумениями, когда я удалял одну локальную ветвь,

git branch -D branch-name

git fetch -p 

но я видел, что это список имен ветвей, которые отображаются для удаления.

Я боялся увидеть список удаленных веток, и, возможно, подумал, что я выполнил неправильную команду и случайно удалил все ветки!!

Что означает эта команда (git fetch -p). Есть идеи?

4b9b3361

Ответ 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 запрашивает fetchgit 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