git pull error: ошибка: удаленная ссылка есть, но ожидается


227

Полное сообщение:

error: Ref refs/remotes/origin/user is at 3636498c2ea7735fdcedc9af5ab3c8689e6abe77 but expected a21359c6cc2097c85775cde6a40105f4bd7100ec
From github.com:{github project url}
 ! a21359c..6273ffc  user -> origin/user  (unable to update local ref)

3
Видимо кто-то переписал историю репозитория git push --force. Попробуйте запустить git pull --force.
xaizek

1
Выдает ту же ошибку с помощью git push --force
Sanjeev Kumar Dangi

5
Ответ на этот вопрос позволил устранить эту ошибку - stackoverflow.com/questions/3046436/…
Санджив Кумар Данги

Ответы:


225

Если вы запускаете git в файловой системе, которая не чувствительна к регистру (Windows или OS X), это произойдет, если есть две ветви с одинаковым именем, но разной капитализацией, например, user_model_changesи так User_model_changesкак обе удаленные ветви будут совпадать с одной и той же ссылкой отслеживания ,

Удалите неправильную удаленную ветку (у вас не должно быть ветвей, которые отличаются только регистром), и тогда git remote prune originи все должно работать


Спасибо за ответ. Это не проблема с этой ошибкой. Я уже нашел решение этой проблемы и разместил в комментарии под вопросом.
Санджив Кумар Данги

2
Помогает и для Mac OS X (файловая система по умолчанию нечувствительна к регистру).
Таммо Фриз

12
да, проблема не чувствительна к регистру в Windows. Я исправил это, вручную удалив ссылку в .git\refs\remotes\originпапке, а затем git pullснова.
Рой Лин

и для тех, кто не знает, где будет находиться папка .git .. она будет создана внутри вашей папки Project / workspace: D
kumar

1
Это ошибка Git. (По крайней мере, сообщение об ошибке неверно). Я надеюсь, что кто-то может сообщить об этой ошибке в проект git. Мне трудно сообщить об ошибке в проект git. github.com/git/git
бронзовый человечек

190

Постоянное исправление

git update-ref -d разрешил мой экземпляр этой ошибки, например

git update-ref -d refs/remotes/origin/user

Обратите внимание, что это не влияет на пульт.

В моем случае последующее git fetchизвлечение этой ветви снова и последующие git fetches / pull больше не давали ошибку «удаленный реф в, но ожидается»

Если это не сработает, временное исправление:

Также обратите внимание, что если вас не волнует рассматриваемая ветка (например, вы просто хотите обновить master, а не origin / user), git pullобходной путь - это выборка, а затем просто объединить нужную ветку, например

git fetch # may give an error for a particular branch, but other branches will still be successfully fetched
git merge origin/master

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

52

Просто удалите папки и файлы в \.git\refs\remotes\origin. Работает, когда у вас нет внесенных изменений.


Это может не сработать, если ваш удаленный реф 'упакован' и, следовательно, не в refs / remotes / ** @ Решение JDiMatteo должно работать тогда все же
Alexander Bird

2
Работал на меня. Благодаря тонну!
Свопнил Патва

Работал как шарм! Спасибо!
Анураг С Шарма

43

Я запустил это, чтобы решить проблему:

git gc --prune=now

2
Это исправило проблему для меня.
Амир Ризван

2
для меня тоже ..-- :)
Аравинд Р Пиллаи

3
Спасибо, это решение для меня. Не могли бы вы объяснить немного больше о предложенном вами решении.
Аамол

1
в основном это просто инструмент для сбора мусора в git, поэтому он стирает все, что не синхронизировано, но используется на локальном компьютере для целей кэширования
elad silver

42

Используйте две нижеприведенные команды одну за другой.

git gc --prune=now

git remote prune origin

Это решит вашу проблему.


1
Это работает для меня, но когда я делаю еще одно мерзавец, эта проблема снова
возникает

@Jojin Так же, как вы. И я наконец выбрал способ, которым предоставил Пракаш Сараванан
xi.lin

1
Это должно быть оценено выше, чем предложение по редактированию git-файлов :)
Mike Wise

только это решение работало для меня. Спасибо!
insaineyesay

12

Мне пришлось удалить мою ветку из командной строки по адресу:

.git\refs\remotes\{my remote}\{**my branch**}

а затем вручную делать:

git pull [remote_name] [branch_name]

Я смог вытащить изменения.

Примечание: я использовал SourceTree и не смог сделать это.


В итоге я переименовал свои пульты: у меня было два пульта «Bitbucket / staging» и «bitbucket / staging» в моей истории SourceTree, но только «Bitbucket» появился в командной строке при выполнении: git remote -v. Поэтому я переименовал Bitbucket в bitbucket, и конфликт окончательно исчез, надеюсь, это поможет наиболее вероятным пользователям SourceTree.
Jogam5

Мне также пришлось удалить ветку, .git\packed-refsпрежде чем она была исправлена ​​для меня.
Майкл

6

Хард ресет также решит проблему

git reset --hard origin/master

Вы выбрали лучший ответ?
mruanova

5

Более четкие шаги

  1. в терминале

    cd /.git/refs/remotes/origin
    
  2. делай ls, увидишь несколько веток и ГОЛОВУ

  3. Удалите ветку, которая, по вашему мнению, имеет проблему

    rm branchname
    
  4. Если это не сработало, удалите все ветки / HEAD

    • вы можете тянуть

Надеюсь, это работает сейчас.


это по сути то же самое, что и git update-ref -d <branchname>?
jt000


2

К сожалению, команды GIT, такие как prune и reset или push, не работали для меня. Чернослив работал один раз, а затем проблема вернулась.

Постоянное решение, которое работало для меня, состоит в том, чтобы редактировать файл git вручную. Просто перейдите в папку проекта .git и затем откройте файл pack-refs в текстовом редакторе, таком как Notepad ++. Затем перейдите к строке с ошибочной веткой и обновите ее до ожидаемой.

Если у вас есть сообщение вроде:

«ошибка: невозможно заблокировать ref 'refs / remotes / origin / feature / branch_xxx': находится по адресу 425ea23facf96f51f412441f41ad488fc098cf23, но ожидается 383de86fed394ff1a1aeefc4a522d886adcecd79"

затем в файле найдите строку с 'refs / remotes / origin / feature / branch_xxx'. Гид будет ожидаемый (2-й) - 383de86fed394ff1a1aeefc4a522d886adcecd79. Вам нужно изменить его на реальный (1-й) - 425ea23facf96f51f412441f41ad488fc098cf23.

Повторите эти действия для других ветвей, и вы будете продолжать. Иногда после повторной выборки мне приходилось повторять те же ветки, которые я уже «исправил» ранее. При повторной загрузке GIT обновляет руководства и дает вам самое последнее.

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


1

git for-each-ref --format = 'delete% (refname)' refs / original | git update-ref --stdin git reflog expire --expire = сейчас - все git gc --prune = сейчас


0

То же самое и здесь, но в комментариях ничего нет, это правильно в моем случае, у меня есть только одна ветвь (master) и я использую только файловую систему Unix, эта ошибка возникает случайно, когда я запускаю git fetch --progress --prune origin, и ветвь впереди или «происхождение / мастер». Никто не может совершить, только 1 пользователь может сделать толчок.

ПРИМЕЧАНИЕ: у меня есть подмодуль в репозитории acme, и у acme есть новые изменения подмодуля (новые коммиты), мне нужно сначала выполнить обновление подмодуля с обновлением подмодуля git.

[2014-07-29 13:58:37] Payload POST received from Bitbucket
[2014-07-29 13:58:37] Exec: cd /var/www/html/acme
---------------------
[2014-07-29 13:58:37] Updating Git code for all branches
[2014-07-29 13:58:37] Exec: /usr/bin/git checkout --force master
[2014-07-29 13:58:37] Your branch is ahead of 'origin/master' by 1 commit.
[2014-07-29 13:58:37]   (use "git push" to publish your local commits)
[2014-07-29 13:58:37] Command returned some errors:
[2014-07-29 13:58:37] Already on 'master'
---------------------
[2014-07-29 13:58:37] Exec: /usr/bin/git fetch --progress --prune origin
[2014-07-29 13:58:39] Command returned some errors:
[2014-07-29 13:58:39] error: Ref refs/remotes/origin/master is at 8213a9906828322a3428f921381bd87f42ec7e2f but expected c8f9c00551dcd0b9386cd9123607843179981c91
[2014-07-29 13:58:39] From bitbucket.org:acme/acme
[2014-07-29 13:58:39]  ! c8f9c00..8213a99  master     -> origin/master  (unable to update local ref)
---------------------
[2014-07-29 13:58:39] Unable to fetch Git data

Чтобы решить эту проблему (в моем случае), просто запустите первый git push, если ваша ветка опережает источник.


3
Ваш ответ здесь относится только к тому факту, что ваш локальный репозиторий опережает источник после нового коммита. Это естественное состояние локальной операции git commit и не относится к исходному вопросу.
Давид

0

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


0

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

Я решил это, удалив мою локальную ветвь, затем проверив исходную ветвь, git checkout origin/my_branchа затем выполнивgit checkout my_branch


-1

После постоянного поиска, это решение, которое сработало для меня, влечет за собой сброс / удаление Upstream

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