Коли ви користуєтесь git push origin :staleStuff
, він автоматично видаляється origin/staleStuff
, тож коли ви бігли git remote prune origin
, ви обрізали якусь гілку, яку видалив хтось інший. Більш ймовірно, що вашим колегам зараз потрібно бігти, git prune
щоб позбутися від вилучених гілок.
То що саме git remote prune
робить? Основна ідея: локальні гілки (не відстежуючі гілки) не торкаються git remote prune
командою, і їх слід видалити вручну.
Тепер приклад у реальному світі для кращого розуміння:
У вас є віддалене сховище з 2 гілками: 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
), тому він може бути відсутнім.
(оновлено прикладом та корисною інформацією з коментарів)
git remote show origin
і шукати будь-які гілки з позначкоюstale