Git checkout: обновление путей несовместимо с переключением веток


467

Моя проблема связана с Fatal Git error при переключении ветки .

Я пытаюсь получить удаленную ветку с помощью команды

git checkout -b local-name origin/remote-name

но я получаю это сообщение об ошибке:

fatal: git checkout: обновление путей несовместимо с переключением веток.
Вы намеревались оформить 'origin / remote-name', которое не может быть разрешено как коммит?

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

Почему он не работает в репозитории, с которым я работаю?


1
что изменилось с момента первого запуска этой команды (вызывая сообщение об ошибке)?
VonC

git init git fetch git fetch git: //blabla.com/dir1/Project.git

Ответы:


739

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

git remote show origin

Если удаленная ветвь, которую вы хотите оформить, находится в разделе «Новые удаленные ветки», а не «Отслеживаемые удаленные ветки», вам необходимо сначала получить их:

git remote update
git fetch

Теперь это должно работать:

git checkout -b local-name origin/remote-name

7
Это решило проблему для меня, а не приведенный выше произвольный ответ.
Jessedc

21
Это должно быть "git fetch REPOSITORY_NAME", чтобы получить все ветви в этом хранилище.
Майк Томсен

1
не обязательно. git fetchполучит все ветки из всех удаленных репозиториев.
Михаил Гринич

4
В случае, если кто-то еще борется с полным безумием всего этого: git fetch origin / branchname Это не то же самое, что git fetch. Первое просто приводит к отображению «new (следующая выборка будет храниться в удаленных / исходных файлах)» в столбце, видимом через источник удаленного шоу git.
Александр Келлетт

7
Если вы пытаетесь сделать это для пульта, который вы явно добавили (так, что угодно, кроме источника ), вам нужно будет сделать это, git remote updateпрежде чем ваша выборка получит этот пульт. В противном случае вы получите такие сообщения, как « Did you intend to checkout 'upstream-repo/master' which can not be resolved as commit?Пожалуйста, добавьте это к ответу и сэкономьте людям часы на чтение тех же ответов, которые работают только для происхождения».
Бруно Броноски

150

Альтернативный синтаксис,

git fetch origin remote_branch_name:local_branch_name

12
Это сработало для меня. Имя моей удаленной ветви не является источником. Я не знаю, имеет ли это значение, поскольку я пил водку.
Римиан

13
Это не просто альтернативный синтаксис, но может работать, когда git checkout -b имя_расхода origin / branch_name не работает
codercake 20.12.12

1
Это также исправило мою проблему при запуске «git checkout --track origin / remote-branch», которая первоначально давала ту же ошибку, что и OP до исправления. Спасибо!
Каке

1
Сработал у меня после запуска и проверенный ответ.
AsTeR

2
Да, я подозреваю, что --depthздесь может быть виноват классификатор для оригинального клона. У меня был успех, git fetch remote_branch_name:local_branch_nameно все остальные советы провалились.
Джон Келлехер

46

Попробовав большую часть того, что я мог прочитать в этой теме, безуспешно, я наткнулся на эту: удаленная ветка не отображается в "git branch -r"

Оказалось, что мой файл .git / config был неверным. После простого исправления все ветви появились.

Исходя из

[remote "origin"]
    url = http://stash.server.com/scm/EX/project.git
    fetch = +refs/heads/master:refs/remotes/origin/master

в

[remote "origin"]
    url = http://stash.server.com/scm/EX/project.git
    fetch = +refs/heads/*:refs/remotes/origin/*

Сделал трюк


4
Это действительно странная конфигурация. Это говорит git, что нужно только выбирать основную ветку с удаленного компьютера.
Икке

3
Я бы проголосовал 10 раз, если бы мог! - Кажется, это что-то, что делает новый git при клонировании
mpapis

2
У меня была та же проблема, она сводила меня с ума. Если вы не видите удаленных веток, пожалуйста, проверьте это!
Карлос Гранадос

Слава Богу за ваш ответ :)
Саша

Ум = взорван! Спасибо!
Chiranjib

12

Не уверен, что это полезно или точно относится к вашему вопросу, но если вы пытаетесь получить и извлечь только одну ветку из удаленного репозитория, то следующие команды git помогут вам:

url= << URL TO REPOSITORY >>
branch= << BRANCH NAME >>

git init
git remote add origin $url
git fetch origin $branch:origin/$branch
git checkout -b $branch --track origin/$branch

11

ничего из вышеперечисленного не помогло мне. Моя ситуация немного отличается, моя удаленная ветка не в источнике . но в другом хранилище.

git remote add remoterepo GIT_URL.git
git fetch remoterepo
git checkout -b branchname remoterepo/branchname

Совет: если вы не видите удаленную ветвь в следующем выводе, git branch -v -aнет способа проверить это.

Подтвердили работу над 1.7.5.4


arf, просто пойми, что у VirtualStaticVoid было такое же решение!
Оливье Рефало

+1 для git branch -v -a: у меня был неправильно настроенный пульт, который сказал, fetch = +refs/heads/*:refs/remotes/master/*хотя пульт был вызван upstream.
Кефлавич

7

Для меня то, что сработало, было:

git fetch

Который тянет все ссылки на вашу машину для всех филиалов на удаленном. Тогда я мог бы сделать

git checkout <branchname>

и это сработало отлично. Похоже на верхний проголосовавший ответ, но чуть проще.


4

Я подозреваю, что нет удаленной ветви с именем remote-name, но вы случайно создали локальную ветку с именем origin / remote-name.

Возможно ли, что вы в какой-то момент набрали:

происхождение / удаленное имя ветки git

Таким образом, создавая локальную ветку с именем origin / remote-name? Введите эту команду:

git checkout origin / remote-name

Вы также увидите:

Переключился на ветку "origin / remote-name"

это означает, что это действительно неправильно названное местное отделение, или

Примечание: переход к «origin / rework-isscoring», который не является локальной ветвью
Если вы хотите создать новую ветку из этой проверки, вы можете сделать это
(сейчас или позже), используя -b снова с командой checkout. Пример:
  git checkout -b 

что означает, что это действительно удаленная ветвь.


3

Это не очень интуитивно понятно, но это хорошо работает для меня ...

  mkdir remote.git & cd remote.git & git init
  git remote add origin $REPO
  git fetch origin $BRANCH:refs/remotes/origin/$BRANCH        

Затем запустите команду git branch --track ...

  git branch --track $BRANCH origin/$BRANCH

2

Для меня у меня была опечатка, и моя удаленная ветвь не существовала

Используйте git branch -aдля отображения удаленных веток


1

Может ли ваша проблема быть связана с этим другим SO вопросом «проблема оформления заказа» ?

то есть: проблема, связанная с:

  • старая версия Git
  • любопытный синтаксис извлечения, который должен быть: git checkout -b [<new_branch>] [<start_point>]со [<start_point>]ссылкой на имя коммита, с которого начинается новая ветвь, и 'origin/remote-name'это не так.
    (тогда git branchкак поддерживает начальную точку, являющуюся именем удаленной ветви)

Примечание: что говорит сценарий checkout.sh :

  if test '' != "$newbranch$force$merge"
  then
    die "git checkout: updating paths is incompatible with switching branches/forcing$hint"
  fi

Это похоже на синтаксис git checkout -b [] [remote_branch_name], который одновременно переименовывал ветку и сбрасывал новую начальную точку новой ветки, которая считается несовместимой.


Проблема решена. git checkout -b local-name remote / remote-branch действительно работает
Ikke

1
Интересно, что изменилось с момента первого запуска этой команды (появление сообщения об ошибке)?
VonC

1

После извлечения миллиона раз все еще добавленные пульты не появлялись, хотя капли были в бассейне. Оказывается, опция --tags не должна предоставляться по git remote addкакой-либо причине. Вы можете вручную удалить его из .git / config, чтобы git fetch создала ссылки.

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