git remote prune – не показал столько обрезанных ветвей, сколько я ожидал


С главной страницы:

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 108

1 ответ:

при использовании git push origin :staleStuff, он автоматически удаляет origin/staleStuff, Так что когда вы бежали git remote prune origin, вы подрезали какую-то ветку, которая была удалена кем-то другим. Это более вероятно, что ваши коллеги теперь нужно запустить git 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)

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

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

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

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