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


204

Я получаю эту ошибку для тянуть:

Ваша конфигурация указывает на слияние с ref 'refs /heads / feature / Sprint4 / ABC-123-Branch' с пульта дистанционного управления, но такой ссылки не было получено.

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

Мой конфигурационный файл выглядит так:

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true
    symlinks = false
    ignorecase = true
    hideDotFiles = dotGitOnly
[remote "origin"]
    url = <url here>
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "new-develop"]
    remote = origin
    merge = refs/heads/new-develop
[branch "feature/Sprint4/ABC-123-Branch"]
    remote = origin
    merge = refs/heads/feature/Sprint4/ABC-123-Branch

Можете ли вы поделиться командой, которую вы используете для слияния?
дчайка

1
Эта проблема может возникнуть, когда удаленная ветвь была удалена. Дважды проверьте, действительно ли это там.
Бенни Нойгебауэр

4
Будущие читатели: если вы знаете, что удаленная ветвь существует, проверьте, игнорируете ли вы регистр или нет. Я настроил локальную ветку для отслеживания удаленной ветки, но набрал имя пульта всеми строчными буквами. Просто пришлось перенастроить local для отслеживания origin / BranchName вместо origin / branchname
Jerreck

Я только что получил эту ошибку, и проблема была намного проще, чем ответы ниже, я потерял VPN-соединение. Так что это также ошибка, которую вы получаете, если git не может получить доступ к серверу удаленного источника.
Бен Терли

Мой git-сервер отсутствовал. Это причина.
Делласавия

Ответы:


151

Что это значит

Ваш апстрим - удаленный, originкоторому вы звоните, - больше не имеет или, возможно, никогда не имел (невозможно узнать по этой информации) ветку с именем feature/Sprint4/ABC-123-Branch. Для этого есть одна частая причина: кто-то (возможно, не вы, или вы помните) удалил ветку в этом другом Git-репозитории.

Что делать

Это зависит от того, что вы хотите . Смотрите раздел обсуждения ниже. Ты можешь:

  • создать или заново создать ветку на пульте, или
  • удалите свое местное отделение, или
  • все, что вы можете придумать.

обсуждение

Вы должны быть запущены git pull(если бы вы работали, git mergeвы бы получили другое сообщение об ошибке или вообще никакого сообщения об ошибке).

Когда вы запускаете git fetch, ваш Git связывается с другим Git, основываясь на urlстроке в [remote "origin"]разделе вашей конфигурации. Этот Git запускает команду ( upload-pack), которая, помимо прочего, отправляет вашему Git список всех ветвей. Вы можете использовать, git ls-remoteчтобы увидеть, как это работает (попробуйте, это образовательный). Вот фрагмент того, что я получаю при запуске этого для Git-репозитория для gitсебя:

$ git ls-remote origin
From [url]
bbc61680168542cf6fd3ae637bde395c73b76f0f    HEAD
60115f54bda3a127ed3cc8ffc6ab6c771cbceb1b    refs/heads/maint
bbc61680168542cf6fd3ae637bde395c73b76f0f    refs/heads/master
5ace31314f460db9aef2f1e2e1bd58016b1541f1    refs/heads/next
9e085c5399f8c1883cc8cdf175b107a4959d8fa6    refs/heads/pu
dd9985bd6dca5602cb461c4b4987466fa2f31638    refs/heads/todo
[snip]

В refs/heads/списке всех ветвей , которые существуют на пульте дистанционного управления записью, 1 вместе с соответствующей фиксацией идентификаторов (для refs/tags/записи идентификаторов могут указывать на объекты тег , а не фиксации).

Ваш Git берет каждое из этих названий веток и меняет его в соответствии со fetchстроками в этом же remoteразделе. В этом случае ваш Git заменяет refs/heads/masterс refs/remotes/origin/master, например. Ваш Git делает это с каждым встречающимся именем ветви.

Он также записывает оригинальные имена в специальный файл FETCH_HEAD(вы можете увидеть этот файл, если загляните в свой собственный .gitкаталог). Этот файл сохраняет выбранные имена и идентификаторы.

Эта git pullкоманда предназначена для удобства: она выполняется git fetchна соответствующем удаленном устройстве, а затем git merge(или, если это указано в инструкции git rebase) с любыми аргументами, необходимыми для объединения (или перебазировки), как указано в [branch ...]разделе. В этом случае ваш [branch "feature/Sprint4/ABC-123-Branch"]раздел говорит, что нужно извлечь origin, а затем объединить с любым идентификатором, найденным под именем refs/heads/feature/Sprint4/ABC-123-Branch.

Поскольку под этим именем ничего не найдено, git pullжалуется и останавливается.

Если вы выполняете это как два отдельных шага, git fetchа затем git merge(или git rebase), ваш Git будет смотреть на ваши кэшированные remotes/origin/ветки удаленного отслеживания, чтобы увидеть, что объединить или перебазировать. Если когда-то была такая ветвь, у вас все еще может быть ветка удаленного отслеживания. В этом случае вы не получите сообщение об ошибке. Если такой ветки никогда не было или вы работали git fetchс --prune(которая удаляет мертвые ветки удаленного отслеживания), так что у вас нет соответствующей ветки удаленного отслеживания, вы получите жалобу, но origin/feature/Sprint4/ABC-123-Branchвместо этого будет указана ссылка .

В любом случае , мы можем заключить, что feature/Sprint4/ABC-123-Branchне существует в настоящее время на удаленном имени origin.

Возможно, он существовал когда-то, и вы, вероятно, создали свою локальную ветку из ветви удаленного отслеживания. Если это так, у вас, вероятно, все еще есть ветка удаленного отслеживания. Вы можете выяснить, кто удалил ветку с пульта и почему, или вы можете просто нажать что-то, чтобы воссоздать ее, или удалить ветку удаленного отслеживания и / или вашу локальную ветку.


+1 Ну, все, что он собирается признать , по крайней мере. Но если они специально не спрятали некоторые ссылки, список включает в себя все.

Edit, Jul 2020: есть новый протокол выборки, который может избежать перечисления всего , и только перечислять имена, которые, как говорит ваш Git, он ищет. Это может помочь с репозиториями, которые имеют огромное количество веток и / или тегов. Однако, если ваш Git интересуется всеми возможными именами, вы все равно получите все имена здесь.


Спасибо за объяснение, что на самом деле делает команда git pull. Я смог исправить свою проблему, запустив git fetch, а затем объединить.
fizch

11
Чтобы удалить несуществующие ссылки на удаленные ветви в вашем локальном репозитории, используйтеgit remote prune origin
Yoav

1
@ Бен-Ури: да, или, бег git fetch --prune origin, или набор fetch.pruneдля trueвашей конфигурации (все три предназначены , чтобы сделать то же самое, хотя и в несколько версий Git некоторые из них не были достаточно надежны).
Торек

1
Вам нужно, git checkout <your remote branch>и все будет хорошо (в некоторых случаях).
Александр Штанг

3
@JonathanBenn: вы можете использовать git branch --set-upstream-to=origin/master masterдля переключения настройки восходящего потока для вашего локального master. Удаление-и-воссоздание имеет это как побочный эффект (при условии, что вы используете стиль DWIM git checkout masterдля его создания), с дополнительным побочным эффектом принуждения вашего masterсоответствия origin/master.
Торек

72

Это также может произойти, если вы / кто-то переименовали ветку. Так что следуйте этим шагам (если вы знаете, что имя ветки переименовано) Предполагая более раннее имя ветви как wrong-branch-nameи кто-то переименовал его в correct-branch-nameSo

git checkout correct-branch-name

git pull (вы увидите это "Ваша конфигурация указывает ..")

git branch --unset-upstream

git push --set-upstream origin correct-branch-name

git pull (вы не получите более раннее сообщение)


1
В этом даже нет необходимости, git pushи он не будет работать, если текущая ветвь находится позади его пульта. git pull origin correct-branch-nameдостаточно.
Пьер

2
Указанная выше команда неверна. Выполните git pull после операции --unset-upstream, в выводе pull вы увидите ошибку с командой для установки восходящего потока, как показано ниже, git branch --set-upstream-to = origin / <branch > mybranch
Ankit Marothi

После того, как я удалил несколько больших файлов из моего репо, он отлично работал, и мне нужно было вернуться к новому репо, который я только что создал
larrytech

40

Проверьте, доступна ли ваша удаленная ветвь. У меня была такая же проблема, наконец-то понял, что удаленная ветка кем-то удалена.


4
Это было то же самое для меня!
Аэрин

3
После запроса на получение слияния (т. Е. Лицо, которое произвело слияние) имеет возможность удалить ветвь, которая была объединена с целевой ветвью. Если вы попытаетесь потянуть в этот момент, вы получите эту ошибку.
Артокун,

это правда :)
Малхаар Пенджаби

7

Для меня это была проблема чувствительности к регистру. Моя локальная ветвь была Version_feature2 вместо Version_Feature2. Я перепроверил свою ветку, используя правильный корпус, и затем сработал git pull.


2
Это оказалось моей проблемой тоже. Это не обязательно очевидно с довольно длинными / сложными названиями веток.
Хокон К. Олафсен

6

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

Например: исходная ветвь есть, team1-Teamа локальная ветвь была оформлена как team1-team. Тогда это Tв -Teamи tв -teamмогут вызвать такую ошибку. Это случилось в моем случае. Итак, изменив локальное имя на имя ветви источника, ошибка была решена.


6

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

Я сделал:

git commit -m 'first commit' // on remote branch
git pull // on local branch

4

Я получил похожую ошибку, когда действительной причиной было то, что мой диск был переполнен. После удаления некоторых файлов git pullначал работать как я ожидал.


4

Я продолжал сталкиваться с этой проблемой. В моем случае причиной этой ошибки был комментарий @ Jerreck о разнице в именах ветвей. Некоторые инструменты Windows не знают о чувствительности к регистру.

Чтобы отключить чувствительность к регистру в git, выполните эту команду:

git config --global core.ignorecase true

Обратите внимание, что это повлияет не только на имена ветвей. Например, если у вас есть «Foo.h» и «foo.h» в одном каталоге (не очень хорошая идея при создании программного обеспечения для Windows), то я подозреваю, что вы не можете отключить чувствительность к регистру.


2

Просто проверьте, удалил ли кто-нибудь ветку на удаленном компьютере.


1

В моем случае я удалил исходную ветку, из которой была получена моя текущая ветка. Итак, в файле .git / config у меня было:

[branch "simil2.1.12"]
    remote = origin
    merge = refs/heads/simil2.0.5
    rebase = false

simil2.0.5 был удален. Я заменил его с тем же именем ветви:

[branch "simil2.1.12"]
    remote = origin
    merge = refs/heads/simil2.1.12
    rebase = false

и это сработало


1

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

git checkout <your-local-branch>
git branch --set-upstream-to=origin/<correct-remote-branch> <your-local-branch>
git pull

0

Для меня это произошло потому, что я слил ветку dev в master, используя веб-интерфейс, а затем попытался синхронизировать / вытащить, используя VSCode, который был открыт в dev dev. (Странно, что я не смог перейти в master без получения этой ошибки).

git pull
Your configuration specifies to merge with the ref 'refs/heads/dev'
from the remote, but no such ref was fetched.'

Имеет смысл, что он не находит refs /heads / dev - для меня было проще просто удалить локальную папку и снова клонировать.


0

Я получил именно эту ошибку, когда выполнял "git pull", когда мой диск был заполнен. Создали пространство и все снова заработало нормально.


0

Вы можете редактировать ~/.gitconfigфайл в вашей домашней папке. Здесь сохраняются все настройки --global.

Или используйте git config --global --unset-all remote.origin.urlи после запуска git fetchс URL хранилища.


0

Я столкнулся с той же проблемой, где моя текущая ветвь была dev, и я проверял ветку MR и делал git pull после этого. Простой обходной путь, который я выбрал, - я создал новую папку для MR Branch и сделал там git pull, а затем git clone.

Так что в основном я поддерживал разные папки для отправки кода в разные ветки.


0

Я просто получил ту же ошибку, когда я не использовал правильный случай. Я мог бы проверить «интеграция». Git сказал мне, чтобы выполнить git pullобновление, чтобы обновить мою ветку. Я сделал это, но получил упомянутую ошибку. Правильное название филиала - «Интеграция» с большой буквы «I». Когда я проверил эту ветку и вытащил, она работала без проблем.


-2

Если просто работает еще одно нажатие, значит, ваш интернет не подключен.


Несколько отрицательных голосов, и все же это была причина, по которой я получил эту ошибку. У меня был Интернет, но я потерял VPN на своем git-сервере. После повторного подключения к VPN тяга работала нормально.
Бен Терли
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.