Используйте git fetch --prune
(или установите fetch.prune
в файле конфигурации Git: я несколько лет установил глобально go, и теперь мне никогда не придется об этом думать).
Что происходит
Когда вы запускаете git fetch
или git fetch origin
, ваш Git вызывает другой Git, используя удаленное имя, такое как origin
. Этот другой Git перечисляет имена его ветвей и соответствующие им идентификаторы ha sh. (В нем также перечислены имена тегов и другие имена, но здесь нас интересуют имена ветвей.)
Ваш Git берет эти имена ветвей и переименовывает их, чтобы сделать ваши имена для удаленного слежения. Это переименование фактически контролируется параметром remote.origin.fetch
в вашей конфигурации Git:
$ git config --get remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*
Ведущий знак плюс - это флаг принудительного действия: эти ссылки обновляются, как если бы вы использовали git fetch --force
(но другие обновления - нет, если вы не используете git fetch --force
или они тоже помечены). Левая сторона двоеточия, refs/heads/*
, соответствует всем именам ветвей других Git. Правая сторона двоеточия, refs/remotes/origin/*
, обеспечивает переименование: например, refs/heads/master
становится вашим refs/remotes/origin/master
.
Теперь предположим, что вы запускаете git fetch
дважды, с некоторым интервалом времени в в течение которого имена ветвей создаются и / или удаляются в других Git. В первый раз, когда ваш Git позвонит по номеру Git, список включает в себя:
refs/heads/master
refs/heads/br1
refs/heads/br2
Во второй раз, когда ваш Git позвонит им, в списке нет br2
в в нем есть br3
:
refs/heads/master
refs/heads/br1
refs/heads/br3
Если коммит га sh ID для любого из них обновлен, ваш Git обновит соответствующее удаленное отслеживание имя. Но br2
просто больше не существует . Таким образом, ваш refs/remotes/origin/br2
не имеет нового значения.
По умолчанию ваш refs/remotes/origin/br2
сохраняет свое старое значение . С --prune
в действии ваш Git говорит: Ага, то, что могло бы создать или обновить origin/br2
, пропало, поэтому я должен удалить origin/br2
полностью ... и это так.
Опция --prune
, вероятно, должна быть значением по умолчанию, но это не так. Вы можете сделать его вашим по умолчанию с помощью:
git config --global fetch.prune true
, и теперь ваш Git автоматически удалит любое имя удаленного отслеживания, у которого больше нет соответствующего имени ветви на пульте.