Как мне перечислить все удаленные ветки в Git 1.7+?


635

Я пробовал git branch -r, но в нем перечислены только удаленные ветви, которые я отслеживал локально. Как мне найти список тех, кого у меня нет? (Для меня не имеет значения, перечисляет ли команда все удаленные ветви или только те, которые не отслеживаются.)


11
Вы имеете в виду , что вы модифицировали refspec по умолчанию, так что git fetchи git remote updateне забираете все ветви пульта? Потому что в противном случае вы можете просто получить и использовать git branch -r...
Каскабель

2
Я должен иметь. git branch -rпоказывал только удаленные ветви, которые я отслеживал локально. Сейчас работает лучше.
Джеймс А. Розен

Ответы:


805

Для подавляющего большинства [1] посетителей здесь правильный и простой ответ на вопрос «Как мне перечислить все удаленные ветви в Git 1.7+?» является:

git branch -r

Для небольшого меньшинства [1] git branch -r не работает. Если git branch -rне работает попробуйте:

git ls-remote --heads <remote-name>

Если git branch -rне работает, то , может быть , как Cascabel говорит «вы изменили refspec по умолчанию, так что git fetchи git remote updateне забирают все remoteветви«s» .


[1] На момент написания этой сноски 2018-февраль я посмотрел на комментарии и увидел, что git branch -rработы для подавляющего большинства (около 90% или 125 из 140 ).

Если git branch -rне работает, проверка git config --get remote.origin.fetchсодержит подстановочный знак ( *) согласно этому ответу


15
Вы также можете сделать git ls-remote [url]так, чтобы вам не нужно было сначала клонировать его :)
Zsub

142
Этот ответ правильный, но вводит в заблуждение, первое, что пользователи, пришедшие сюда из поисковых систем, должны увидеть так: git branch -rтак как это правильный и самый простой ответ, у автора был особый случай, когда он изменил свое поведение, git branch -rкоторое большинство пользователей, приходящих сюда, не будут есть
Стефан

24
@ Стефан: ты уверен в этом? git branch -rтакже не работал для меня. Это просто список веток, уже отслеженных локально. Но git ls-remote --headsперечислены все ветки, доступные в удаленном хранилище ...
Рексфорд

2
Если кто-то хочет извлечь из ветвей, перечисленных через git ls-remote(и не перечисленных в git branch -r), он должен выполнить git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"перед извлечением, как описано на stackoverflow.com/a/26649770/873282 .
Коппор

11
Не забудьте сделать, git fetch --allпрежде чем получить все текущие удаленные ветви.
А. Аттиа,

174

remote show показывает все ветви на удаленном компьютере, включая те, которые не отслеживаются локально, и даже те, которые еще не были извлечены.

git remote show <remote-name>

Он также пытается показать состояние веток относительно вашего локального хранилища:

> git remote show origin
* remote origin
  Fetch URL: C:/git/.\remote_repo.git
  Push  URL: C:/git/.\remote_repo.git
  HEAD branch: master
  Remote branches:
    branch_that_is_not_even_fetched new (next fetch will store in remotes/origin)
    branch_that_is_not_tracked      tracked
    branch_that_is_tracked          tracked
    master                          tracked
  Local branches configured for 'git pull':
    branch_that_is_tracked merges with remote branch_that_is_tracked
    master                 merges with remote master
  Local refs configured for 'git push':
    branch_that_is_tracked pushes to branch_that_is_tracked (fast-forwardable)
    master                 pushes to master                 (up to date)

Точно. Не получено, не отслежено локально.
Thufir

3
branch_that_is_not_tracked tracked?
Петр Доброгост

3
@PiotrDobrogost Да! branch_that_is_not_trackedэто ветка, которая не отслеживается ни одной локальной веткой git. Однако он был загружен в локальный репозиторий (так что есть удаленная ветвь). По какой-то странной причине git remote showвызывает это состояние tracked, хотя нет локальной ветки, которая отслеживает удаленный. В этом случае противоположность trackedis new, что означает «не извлечено».
Клас Меллборн

это не работает программно, слишком сложно разобрать
Александр Миллс

Это застало меня в особом случае, когда я локально вытащил удаленную ветку, которая затем была удалена. Затем git branch -rпредполагает, что удаленная ветвь все еще существует, но git remote show originпоказывает, что refs/remotes/origin/my-now-dead-branch stale (use 'git remote prune' to remove). Гораздо полезнее!
icc97

54
git branch -a | grep remotes/*

10
Это в основном эквивалентно тому git branch -r, что, по словам ОП, недостаточно.
Каскабель

9
на самом деле оба git branch -aи git branch -rперечислить все удаленные ветви для меня, я не уверен, правда ли то, что сказал ОП. Я просто настроил тестовое хранилище и проверил это (имел только мастер / источник отслеживания master, но все равно видел все удаленные ветви с обоими флагами).
Идан К

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

Это решение, кажется, не перечисляет удаленные ветви, созданные с момента последней загрузки.
Анубиан Нуб

Странная вещь: в течение многих лет я git fetchследовал git branch -a, что только недавно начало терпеть неудачу для меня. Возможно, поведение мерзавца изменилось?
Себастьян Мах

39

Используя git branch -rсписки всех удаленных филиалов и git branch -aсписки всех филиалов на локальных и удаленных. Эти списки устарели, хотя. Чтобы поддерживать эти списки в актуальном состоянии, запустите

git remote update --prune

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

Вы можете ускорить это обновление, указав пульт, иначе он будет получать обновления со всех добавленных вами пультов, например, так

git remote update --prune origin

Это решило мою проблему - у меня теперь работает git branch -r.
Фрэнсис Нортон

27

Но

git branch -ar

должен сделать это.


41
Передача обоих аргументов является излишней. -rвозвращает только удаленные ветки. -aвозвращает как локальные, так и удаленные филиалы. Таким образом, git branch -aи git branch -arоба дают одинаковый выход.
Уолтер Роман

19

Вы также можете сделать git fetchпосле git branch -r. Без fetch вы не увидите самые актуальные ветки.


git fetch --allиметь все текущие ветки
A. Attia

19

Git Branching - Удаленные ветки

git ls-remote

Git документация .


git ls-remote --heads, чтобы получить более конкретные результаты
Вольфганг Фаль

1
Это единственная команда , которая также перечисляет мою ветку , я случайно толкнул без heads/в refs/heads/features/my-branch, спасибо!
msa


9

TL; TR;

Это решение вашей проблемы:

git remote update --prune    # To update all remotes
git branch -r                # To display remote branches

или:

git remote update --prune    # To update all remotes
git branch <TAB>             # To display all branches

5

Лучшая команда для запуска git remote show [remote]. Это покажет все ветви, удаленные и локальные, отслеженные и неотслеживаемые.

Вот пример из проекта с открытым исходным кодом:

> git remote show origin
* remote origin
  Fetch URL: https://github.com/OneBusAway/onebusaway-android
  Push  URL: https://github.com/OneBusAway/onebusaway-android
  HEAD branch: master
  Remote branches:
    amazon-rc2                   new (next fetch will store in remotes/origin)
    amazon-rc3                   new (next fetch will store in remotes/origin)
    arrivalStyleBDefault         new (next fetch will store in remotes/origin)
    develop                      tracked
    master                       tracked
    refs/remotes/origin/branding stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    develop merges with remote develop
    master  merges with remote master
  Local refs configured for 'git push':
    develop pushes to develop (local out of date)
    master  pushes to master  (up to date)

Если мы просто хотим получить удаленные ветки, мы можем использовать grep. Команда, которую мы хотели бы использовать:

grep "\w*\s*(new|tracked)" -E

С помощью этой команды:

> git remote show origin | grep "\w*\s*(new|tracked)" -E
    amazon-rc2                   new (next fetch will store in remotes/origin)
    amazon-rc3                   new (next fetch will store in remotes/origin)
    arrivalStyleBDefault         new (next fetch will store in remotes/origin)
    develop                      tracked
    master                       tracked

Вы также можете создать псевдоним для этого:

git config --global alias.branches "!git remote show origin | grep \w*\s*(new|tracked) -E"

Тогда вы можете просто бежать git branches.




4

Просто запустите git fetchкоманду. Он вытянет все удаленные ветви в ваш локальный репозиторий, а затем сделает git branch -aсписок всех ветвей.


1

Если есть удаленная ветка, которая, как вы знаете, должна быть в списке, но ее нет в списке, вы можете проверить, правильно ли настроен ваш источник:

git remote show origin

Если это все хорошо, возможно, вам стоит запустить обновление:

git remote update

Предполагая, что это работает успешно, вы должны быть в состоянии сделать то, что говорят другие ответы:

git branch -r

1

Используя эту команду,

git log -r --oneline --no-merges --simplify-by-decoration --pretty=format:"%n %Cred CommitID %Creset: %h %n %Cred Remote Branch %Creset :%d %n %Cred Commit Message %Creset: %s %n"

CommitID       : 27385d919
Remote Branch  : (origin/ALPHA)
Commit Message :  New branch created

В нем перечислены все удаленные ветви, включая сообщения о фиксации и идентификаторы фиксации, на которые ссылаются удаленные ветви.


1

Я хотел бы использовать:

git branch -av

Эта команда не только показывает вам список всех веток, включая удаленные, начиная с веток /remote, но также предоставляет вам *отзывы о том, что вы обновили, и комментарии о последнем коммите.


0

Убедитесь, что удаленный источник, который вы перечисляете, действительно является требуемым хранилищем, а не более старым клоном.


0

Я закончил тем, что делал беспорядок оболочки, чтобы получить то, что я хотел. Я просто слил ветки из источника удаленного:

git branch -r --all --merged \
    | tail -n +2 \
    | grep -P '^  remotes/origin/(?!HEAD)' \
    | perl -p -e 's/^  remotes\/origin\///g;s/master\n//g'

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.