git fetch не выбирает все ветки

Я клонировал репозиторий, после чего кто-то еще создал новую ветку, над которой я хотел бы начать работать. Я прочитал руководство, и оно кажется невероятно простым. Странно, что это не работает, и все сообщения, которые я нашел, предполагают, что я делаю правильные вещи. Поэтому я подвергну себя критике, потому что с этим должно быть что-то явно не так:

Правильное действие кажется

git fetch
git branch -a
* master
  remotes/origin/HEAD --> origin/master
  remotes/origin/master
git checkout -b dev-gml origin/dev-gml

На данный момент есть проблема, по какой-то причине после git fetch Я не вижу удаленную ветку dev-gml. Почему бы и нет? Если я клонирую репозиторий заново, он там, так что, безусловно, существует удаленная ветка:

$ mkdir ../gitest
$ cd ../gitest
$ git clone https://github.com/example/proj.git
Cloning into proj...
remote: Counting objects: 1155, done.
remote: Compressing objects: 100% (383/383), done.
remote: Total 1155 (delta 741), reused 1155 (delta 741)
Receiving objects: 100% (1155/1155), 477.22 KiB | 877 KiB/s, done.
Resolving deltas: 100% (741/741), done.
$ cd projdir
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/dev-gml
  remotes/origin/master

я пробовал git update, git pull, git fetch --all, git pretty-please во всех возможных перестановках...

13 ответов

Решение

Проблема может быть замечена при проверке remote.origin.fetch установка
(Строки, начинающиеся с $ являются подсказками bash с набранными мною командами. Другие строки являются результатом)

$ git config --get remote.origin.fetch
+refs/heads/master:refs/remotes/origin/master

Как вы можете видеть, в моем случае, пульт был настроен на выборку главной ветки специально и только. Я исправил это, как показано ниже, включая вторую команду для проверки результатов.

$ git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
$ git config --get remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*

Подстановочный знак * конечно означает все под этим путем.

К сожалению, я увидел этот комментарий после того, как я уже покопался и нашел ответ методом проб и ошибок.

У меня была эта проблема сегодня на репо.

Это был не +refs/heads/*:refs/remotes/origin/* вопрос согласно топ-решению.

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

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

удалить с помощью:git remote rm origin

и воссоздать с:git remote add origin <git uri>

Чтобы отследить (новую) удаленную ветвь как локальную:

git checkout -b <local branch> <remote>/<remote branch>

или (иногда это не работает без дополнительного remotes/):

git checkout -b <local branch> remotes/<remote>/<remote branch>

Изменить: вам нужно запустить git remote update или же git remote update <remote>, Тогда вы можете запустить git branch -r перечислить удаленные филиалы.

Полезные хитрости

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

git remote rm origin
git remote add origin git@github.com:web3coach/the-blockchain-bar-newsletter-edition.git

git fetch --all
// Ta daaa all branches fetched

Напиши это из терминала

git fetch --prune.

это работает отлично.

У меня была аналогичная проблема, однако в моем случае я мог тянуть / нажимать на удаленную ветку, но git status не показывал состояние локального филиала по сравнению с удаленными.

Также в моем случае git config --get remote.origin.fetch ничего не вернул

Проблема в том, что в .git/configфайл в строке выборки соответствующего удаленного блока. Вероятно, что-то, что я добавил по ошибке ранее (иногда я смотрю этот файл напрямую или даже редактирую его)

Итак, проверьте, есть ли ваша удаленная запись в .git/config файл правильный, например:

[remote "origin"]
    url = https://[server]/[user or organization]/[repo].git
    fetch = +refs/heads/*:refs/remotes/origin/*

git checkout --track origin/formatsвроде бы получилось:

      % git branch      ### show local branches
* main

% git branch - a  ### show local and remote branches
* main
  remotes/origin/HEAD -> origin/main
  remote/origin/formats
  remote/origin/main

% git checkout --track origin/formats
Switched to a new branch 'formats'
Branch 'formats' set up to track remote branch 'formats' from 'origin'

% git branch
* formats
  main

Следующее должно сделать то же самое, но с другим именем локальной ветки:

      git checkout -b my-formats origin/formats 

Новый синтаксис git switchдоступен в git c2.23

      git switch -c <branch> --track <remote>/<branch>

Я клонировал репо с --глубиной 1, поэтому эти ответы не работали. Что мне помогло, так это

      git fetch origin BRANCHNAME:BRANCHNAME

Он успешно создал локальную ветку с тем же именем.

Чтобы сделать его более конкретным, создайте отслеживающую ветвь, что означает, что вы сейчас отслеживаете удаленную ветвь.

git branch --track branch remote-branch
git branch --track exp remotes/origin/experimental

После чего вы можете

git branch   # to see the remote tracking branch "exp" created .

Затем, чтобы работать на этой ветви сделать

git checkout branchname
git checkout exp

После того, как вы внесли изменения в ветку. Вы можете выполнить git fetch и git merge с удаленной веткой отслеживания, чтобы объединить ваши изменения и отправить в удаленную ветку, как показано ниже.

git fetch origin
git merge origin/experimental  
git push origin/experimental

Надеюсь, это поможет и даст вам представление о том, как это работает.

Это может произойти из-за того, что вы переключаетесь между несколькими клонами, легко оказаться в неправильном дереве исходных текстов, пытаясь вытянуть несуществующую ветвь. Проще, когда клоны имеют схожие имена или репозитории являются отдельными клонами для одного и того же проекта от каждого из нескольких участников. Очевидно, новый git-клон, похоже, решит эту "проблему", когда реальная проблема - потерять фокус, рабочий контекст или и то, и другое.

Мне пришлось зайти в мои удаленные репозитории GitExtensions, так как здесь ничего не работало. Там я увидел, что 2 ветки не имеют настроенного удаленного хранилища. после регулировки выглядит следующим образом

Уведомление филиал noExternal3 все еще показывает, что не имеет удаленного хранилища. Не уверен, какое сочетание команд bash нашло бы или настроило это.

Все, что вам нужно сделать, это применить следующие 2 команды:

      git fetch --all

И как только вы увидите ветку (которая не была видна раньше, например , osc_at_works), выберите ее и проверьте, как показано ниже:

      git checkout origin/team/Enterprise/osc_at_works

У нас была такая же проблема, и вы должны использовать

git fetch

git push origin branch_name

git branch -r

Надеюсь, что это поможет кто-то сталкивается с той же проблемой

Другие вопросы по тегам