Git: не отображается новая удаленная ветка

119

Коллега подтолкнул новую удаленную ветку к origin / dev / homepage, и я не вижу ее, когда запускаю:

$ git branch -r

Я все еще вижу существующие удаленные ветки.

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

гибрид9
источник
Связанная проблема - Невозможно увидеть удаленную ветку
RBT
1
удалось забыть git pull, спасибо
Елена Чуклина
1
В моем случае все git fetch <name-of-remote>получилось. Без названия пульта НЕ работал.
Menno Deij - van Rijswijk,

Ответы:

166

Во-первых, дважды проверьте, действительно ли ветка была удалена, с помощью команды git ls-remote origin. Если в выходных данных появляется новая ветка, попробуйте дать команду git fetch: она должна загрузить ссылки на ветки из удаленного репозитория.

Если ваша удаленная ветка по-прежнему не отображается, дважды проверьте (в ls-remoteвыходных данных), каково имя ветки на удаленном компьютере и, в частности, начинается ли оно с refs/heads/. Это потому, что по умолчанию значение remote.<name>.fetch:

+refs/heads/*:refs/remotes/origin/*

так что только удаленные ссылки, имя которых начинается с, refs/heads/будут отображаться локально как ссылки удаленного отслеживания refs/remotes/origin/(т.е. они станут ветвями удаленного отслеживания)

Марко Леогранде
источник
4
Я смог увидеть новую удаленную ветку после выполнения git fetch origin, но не уверен, в чем разница, если я просто выполнил git fetch? Я читал об удаленном обновлении git, но не понимал, что это могло бы сделать. Нужно ли мне запускать git fetch для любых новых удаленных веток отсюда?
гибрид 9
1
@ hybrid9 Если вы используете git fetch, git загрузит ссылки из удаленного репозитория по умолчанию, который был указан в .git/config: обычно он будет вызываться origin, поэтому обе команды эквивалентны, но ваша конкретная конфигурация по какой-то причине может отличаться. Нет, вам не нужно отдавать git fetchдля каждой ветки, так как (по умолчанию) он выбирает все ветки.
Марко Леогранде
1
@ hybrid9 git pullэквивалентен git fetch+ git merge(или git rebaseесли вы изменили значения по умолчанию), поэтому вы можете продолжать использовать git pullкак обычно, и новые удаленные ветки появятся сами собой.
Марко Леогранде
1
Изначально я запускал git pull, но никогда не видел этой новой удаленной ветки, которая меня действительно смутила. Только пока я не запустил git fetch origin. Я ценю время, потраченное на ответы на мои вопросы.
гибрид 9
2
@hybrid У меня такая же проблема. git ls-remote gerritrepo:projectпоказывает новую удаленную ветку, но git branch -aнет ... Мне нужно сделать еще один клон, и только тогда появится новая ветка
Викрам
80

Проверить, .git/configсодержит ли

[remote "origin"]
    url = …
    fetch = +refs/heads/master:refs/remotes/origin/master

Если да, измените его на

[remote "origin"]
    url = …
    fetch = +refs/heads/*:refs/remotes/origin/*

Тогда вы сможете его использовать:

$ git fetch
remote: Counting objects: …
remote: Compressing objects: ..
Unpacking objects: …
remote: …
From …
 * [new branch]            branchname -> origin/branchname
$ git checkout branchname
Branch branchname set up to track remote branch branchname from origin.
Switched to a new branch 'branchname'
Джесси Глик
источник
12
Это случилось со мной после первоначального неглубокого клона.
ArkTekniK
Отлично!!! Большое спасибо! Это случилось со мной при установке пользовательского крана Homebrew с помощью команды brew tap user/repo: локальная копия репо, клонированная с помощью, brewимела указанные вами настройки, и было невозможно увидеть и использовать другие ветки, которые у меня были в моем репо. Еще раз спасибо! :) +1!
rmbianchi
3
Следующая команда может использоваться вместо ручного редактирования файла .git / config . git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"а затем git fetch originполучить все ветки по происхождению .
dotnetCarpenter
это хороший!
madz
47

Самый простой ответ:

git fetch origin <branch_name>

Яцек Дзюрджиковски
источник
2
Это было буквально ЕДИНСТВЕННОЕ, что сработало для меня.
Теодор Р. Смит
3
У меня это не работает. Я получаю эту ошибку:fatal: Couldn't find remote ref <branch_name>
Parisa Khateri
3
да, это сработало и для меня, после того, как этот git checkout работал нормально !!
whoami
30

Делая удаленного обновления git также обновит список веток, доступных из удаленного репозитория.

Если вы используете TortoiseGit, начиная с версии 1.8.3.0, вы можете выполнить «Git -> Sync», и в нижнем левом углу появившегося окна появится кнопка «Удаленное обновление». Щелкните это. Затем вы сможете выполнить «Git -> Switch / Checkout», и новая удаленная ветка появится в раскрывающемся списке ветвей, которые вы можете выбрать.

метагорня
источник
18
git remote updateэто старый способ сделать это, более новая предпочтительная команда git fetch.
В моей версии TortoiseGit (2.8.0.0) кнопка в левом нижнем углу имеет несколько параметров под стрелкой и запоминает то, что вы выбрали ранее. Это означает, что на кнопке может не указываться «Удаленное обновление». Если вы не использовали его раньше, он скажет «Тянуть». Итак, нажмите на стрелку, и вы увидите «Удаленное обновление» в списке опций.
Майкл Хайндс
14

Допустим, мы ищем релиз / 1.0.5

Когда git fetch -allэто не работает , и что вы не можете видеть удаленный филиал и git branch -rне показывать эту конкретную отрасль.

1. Вывести все ссылки с удаленного компьютера (ветки, теги, ...):

git ls-remote origin Должен показать вам удаленную ветку, которую вы ищете.

e51c80fc0e03abeb2379327d85ceca3ca7bc3ee5        refs/heads/fix/PROJECT-352
179b545ac9dab49f85cecb5aca0d85cec8fb152d        refs/heads/fix/PROJECT-5
e850a29846ee1ecc9561f7717205c5f2d78a992b        refs/heads/master
ab4539faa42777bf98fb8785cec654f46f858d2a        refs/heads/release/1.0.5
dee135fb65685cec287c99b9d195d92441a60c2d        refs/heads/release/1.0.4
36e385cec9b639560d1d8b093034ed16a402c855        refs/heads/release/1.0
d80c1a52012985cec2f191a660341d8b7dd91deb        refs/tags/v1.0

В выводе появится новая ветка 'release / 1.0.5'.

2. Принудительно получить удаленную ветку:

git fetch origin <name_branch>:<name_branch>

$ git fetch origin release/1.0.5:release/1.0.5

remote: Enumerating objects: 385, done.
remote: Counting objects: 100% (313/313), done.
remote: Compressing objects: 100% (160/160), done.

Receiving objects: 100% (231/231), 21.02 KiB | 1.05 MiB/s, done.
Resolving deltas: 100% (98/98), completed with 42 local objects.
From http://git.repo:8080/projects/projectX
 * [new branch]        release/1.0.5 -> release/1.0.5

Теперь у вас также есть ссылки локально, вы проверяете (или что-то еще) эту ветку.

Работа выполнена!

jpmottin
источник
1
Ты спасатель :)
Чакри
№2 было тем, что я искал. Спасибо!
Матфей,
4

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

BlackHatSamurai
источник
Ой! Хороший!
Marc
2

Я использовал грубую силу и удалил пульт, а затем добавил его

git remote rm <remote>
git remote add <url or ssh>
Резиновая утка
источник
1

В конце концов, у меня сработало добавление имени удаленного репозитория к git fetchкоманде, например:

git fetch core

Теперь вы можете увидеть их все вот так:

git branch --all
Серж Саган
источник
0

Вы можете проверить удаленную ветку / n git fetch && git checkout remotebranch

тао ву
источник