'git branch -av' показывает удаленную ветку, которая больше не существует

168

Возможно, это глупый вопрос, но я новичок в git и вижу удаленную ветку, которой больше не существует.

$ git branch -a
* master
  remotes/origin/master
  remotes/origin/production

Я не верю, что производственный филиал существует удаленно, и не могу понять, почему он все еще отображается локально. Как я могу удалить / удалить эту ветку? Вот как выглядит попытка удаления:

$ git push origin :production

error: unable to push to unqualified destination: production
The destination refspec neither matches an existing ref on the remote nor
begins with refs/, and we are unable to guess a prefix based on the source ref.
error: failed to push some refs to 'git@IP:puppet.git'

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

$ git checkout origin/production
Note: checking out 'origin/production'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at c323996... added powerdns module, no really

Я понятия не имею, какого черта я делаю. Любая помощь будет оценена.

CarpeNoctem
источник
какой выход git branch -aпосле git fetch?
аледиаферия
У дубликата, который я предложил, есть ответ, который объясняет гораздо больше, чем манойлды сделали здесь.
Каскабель

Ответы:

338

Ты должен сделать:

git remote prune origin
manojlds
источник
8
Спасибо, что сработало! Можете ли вы рассказать, что происходит за кулисами?
CarpeNoctem
12
Это удаленные ветви отслеживания в вашем локальном репо, и вы должны удалить их, если ветви удалены в удаленном репо.
manojlds
2
Редко я так быстро нахожу и внедряю такой простой вопрос и ответ.
17
Превосходно. В моем локальном я видел странные ветви, которые не имели никакого отношения к репо с базой кода. Когда я запускал эту команду, она настраивала мою локальную ветку происхождения, а затем я добавил основной поток .thanks
Ankur Srivastava
54

Итак, есть две проблемы. В обоих случаях помните, что Git распространяется.

Первый. Когда вы делаете такие вещи, как

$ git branch -a

Операция выполняется на вашем локальном репо, а НЕ на удаленном компьютере. Другими словами, ваш локальный репо сообщает обо всех ветках, о которых он знает. Это могут быть локальные ветви (например, «master») или удаленные ветви, которые он извлек из удаленного узла. Со времени последней выборки ветка «production» удаленного репо изменилась, но ваше локальное репо этого не знает. Ответ от manojlds , правильный. Бегать

$ git remote prune origin

удалить несвежие ветви.

Команда «git push origin: production» используется для удаления ветки из git-репозитория удаленного компьютера. Не ваш местный репо. В этом случае кто-то другой уже удалил ветку на git-репозитории удаленного компьютера, поэтому вы видите это сообщение об ошибке.

Вот ссылка, которая суммирует эти команды.

Вторая проблема касается оформления заказа.

При проверке ветви вы хотите сделать это из локальной ветви, а не из удаленной ветви. Вот почему вы получаете ошибку об отделенной голове. В репозитории git-notes есть хорошее объяснение этой проблемы в мельчайших деталях. В основном ключевая фраза

Однако, когда вы извлекаете что-либо, что не является правильным локальным именем ветви, тогда HEAD больше не является символической ссылкой на что-либо. Вместо этого он фактически содержит хэш SHA-1 (идентификатор фиксации) коммита, на который вы переключаетесь.

Теперь, как проверить локальную ветку, такую ​​же, как удаленная ветка?

Легко, вы создаете локальное отделение, на момент оформления заказа удаленное отделение.

$ git checkout -b my_local_branch origin / production

Пабло Маурин
источник
20
git remote prune origin

это правильно, просто добавив, вы можете использовать --dry-runопцию, которая сообщает, какие ветви будут удалены из вашего локального репо, но на самом деле не сокращает их

git remote prune origin --dry-run
0xcrab
источник