Git удаленная чернослив - не отображалось столько обрезных ветвей, сколько я ожидал

На странице man:

Deletes all stale tracking branches under <name>.
These stale branches have already been removed from the remote repository
referenced by <name>, but are still locally available in "remotes/<name>".

Итак, я удалил кучу ветвей, используя

git push origin :staleStuff

а затем запустил

git remote prune origin

Однако только одна локальная ветвь была обрезана. Некоторые из этих веток были созданы мной, некоторые - сотрудниками. Означает ли это, что я не правильно отслеживал эти ветки в первую очередь?

Ответ 1

Когда вы используете git push origin :staleStuff, он автоматически удаляет origin/staleStuff, поэтому при запуске git remote prune origin вы обрезали какую-либо ветвь, которая была удалена кем-то другим. Скорее всего, ваши сотрудники теперь должны запустить git prune, чтобы избавиться от удаленных веток.


Итак, что именно делает git remote prune? Основная идея: локальные ветки (не отслеживающие ветки) не затрагиваются командой git remote prune и должны быть удалены вручную.

Теперь, реальный пример для лучшего понимания:

У вас есть удаленный репозиторий с двумя ветвями: master и feature. Предположим, что вы работаете в обеих ветвях, так что в результате у вас есть эти ссылки в вашем локальном репозитории (указаны полные имена ссылок, чтобы избежать путаницы):

  • refs/heads/master (краткое название master)
  • refs/heads/feature (краткое имя feature)
  • refs/remotes/origin/master (короткое имя origin/master)
  • refs/remotes/origin/feature (короткое имя origin/feature)

Теперь, типичный сценарий:

  • Некоторые другие разработчики заканчивают работу над feature, объединяют ее в master и удаляют ветвь feature из удаленного репозитория.
  • По умолчанию, когда вы выполняете git fetch (или git pull), ссылки не удаляются из вашего локального репозитория, поэтому у вас все еще есть все 4 ссылки.
  • Вы решили их очистить и запустите git remote prune origin.
  • git обнаруживает, что ветвь feature больше не существует, поэтому refs/remotes/origin/feature является устаревшей ветвью, которую нужно удалить.
  • Теперь у вас есть 3 ссылки, включая refs/heads/feature, потому что git remote prune не удаляет ссылки refs/heads/*.

Можно идентифицировать локальные ветки, связанные с удаленными ветвями отслеживания, с помощью параметра конфигурации branch.<branch_name>.merge. Этот параметр не требуется для работы (возможно, кроме git pull), поэтому он может отсутствовать.

(обновляется с примером и полезной информацией из комментариев)