«Невозможно обновить пути и переключиться на ветку одновременно»

186

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

В новой среде я получаю эту ошибку:

$ git checkout -b test --track origin/master
fatal: Cannot update paths and switch to branch 'test' at the same time.
Did you intend to checkout 'origin/master' which can not be resolved as commit?

Почему Git это не нравится? Это раньше работало с тем же репо.

marekful
источник
6
В сообщении об ошибке сообщается, что origin/masterэто не идентификатор фиксации, т. Е. Недопустимая удаленная ветвь. Это отображается в git branch -rвыводе?
Торек
Это не так. Оказывается, я не проверял все удаленные ветви во время клонирования.
marekful

Ответы:

199

' origin/master', который не может быть разрешен как коммит

Странно: вам нужно проверить пульты:

git remote -v

И убедитесь, что originэто извлечено:

git fetch origin

Затем:

git branch -avv

(чтобы увидеть, если вы получили origin/masterветку)

Наконец, используйте git switchвместо запутанногоgit checkout , с Git 2.23+ (август 2019).

git switch -c test --track origin/master
VonC
источник
11
В моей команде была опечатка, которая вызвала эту ошибку; Я не правильно написала свой пульт!
Qix
2
Это была новая ветка, и мой местный репозиторий не знал об этом. Я должен был сделать, pullа затем эта команда сработала.
coding_idiot
2
Этот ответ был полезен, потому что он показал мне, что на самом деле происходит что-то странное: удаленные ветки установлены правильно, но новая удаленная ветвь просто не извлекается. Когда я клонирую пульт в чистый каталог, он работает. Может ли мой .gitкаталог быть поврежден?
Конрад Рудольф
git remote -v вернул эту ошибку фатально: Недопустимое имя объекта: 'remote'.
Карим Самир
@KarimSamir вы можете задать отдельный вопрос (с вашей ОС и версией git), так как git remote -vвыполнение в репозитории git работает.
VonC
79

FWIW: Если у вас есть опечатка в вашем фирменном наименовании, вы получите ту же ошибку.

Ludder
источник
4
На самом деле было бы неплохо, если бы кто-то мог найти время, чтобы сообщить разработчикам Git об этом, сообщение об ошибке не очень информативно;)
Scorchio
8
да, это была моя проблема, у меня был пробел в названии моей ветви
Карим Самир
То же самое здесь, я пытался git checkout -b origin mybranchвместо git checkout -b mybranch(дополнительно origin)
Гийом Ренуль
Я скопировал и вставил имя своей ветви и после имени ветви имел пробел, который вызвал эту ошибку.
learningKnight
Я пытался оформить заказ orgin/my-branchвместо origin/my-branch. Пропустил, iи я продолжал чесать голову, чтобы понять, почему старый союзник отказывается ладить. Опечатка действительно была проблемой.
DDM
55

Вы можете получить эту ошибку в контексте, например, сборки Travis, которая по умолчанию проверяет код с помощью git clone --depth=50 --branch=master. Насколько мне известно, вы можете контролировать с --depthпомощью, .travis.ymlно не --branch. Так как это приводит к тому, что пульт отслеживает только одну ветвь, вам необходимо независимо обновить пульт, чтобы отследить нужные ссылки на пульте.

Перед:

$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master

Исправление:

$ git remote set-branches --add origin branch-1
$ git remote set-branches --add origin branch-2
$ git fetch

После:

$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/branch-1
remotes/origin/branch-2
remotes/origin/master
Боб Аман
источник
5
Решил это для меня. Я использовал неглубокий клон --depth = 1, и это то, что мне нужно для переключения веток.
Sawtaytoes
1
Гах да, глубина, безусловно, приводит к этой ошибке! Если возможно, я бы предложил отредактировать первые несколько предложений, чтобы подчеркнуть глубину.
Dubslow
20

Эта простая вещь сработала для меня!

Если он говорит, что не может делать 2 вещи одновременно, разделите их.

git branch branch_name origin/branch_name 

git checkout branch_name
Эшвини Редди
источник
Позволяет легко выяснить, в чем заключается настоящая проблема
З. Халла
9

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

  1. Выполните следующую команду, чтобы получить список веток, известных вашему локальному хранилищу.

git remote show origin

который выводит это:

 remote origin
  Fetch URL: <your_git_path>
  Push  URL: <your_git_path>
  HEAD branch: development
  Remote branches:
    development                             tracked
    Feature2                                tracked
    master                                  tracked
    refs/remotes/origin/Feature1         stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    Feature2     merges with remote Feature2
    development  merges with remote development
    master       merges with remote master
  Local refs configured for 'git push':
    Feature2     pushes to Feature2     (up to date)
    development  pushes to development (up to date)
    master       pushes to master      (local out of date)
  1. После проверки таких деталей, как (выборка URL-адреса и т. Д.), Запустите эту команду, чтобы получить любую новую ветку (т. Е. Которую вы можете оформить в локальном репо), которая существует в удаленном, но не в вашем локальном.
» git remote update

Fetching origin
From gitlab.domain.local:ProjectGroupName/ProjectName
 * [new branch]      Feature3    -> Feature3

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

» git checkout -b Feature3 origin/Feature3

Branch Feature3 set up to track remote branch Feature3 from origin.
Switched to a new branch 'Feature3'

Нет необходимости явно указывать Git отслеживать (используя --track ) ветку с помощью remote.

Приведенная выше команда установит локальную ветвь для отслеживания удаленной ветки от источника.

ssasi
источник
4

Если у вас есть пробел в вашей ветке, вы получите эту ошибку.

dansek
источник
1

Для меня мне нужно было добавить пульт:

git remote -add myRemoteName('origin' in your case) remoteGitURL

тогда я мог бы получить

git fetch myRemoteName
RayLoveless
источник
1

Это обусловлено тем, что ваша локальная ветка не отслеживает удаленную ветку. Как сказал ssasi, вам нужно использовать эти команды:

git remote update
git fetch
git checkout -b branch_nameA origin/branch_nameB

Я решил свою проблему только сейчас ....

questionKing
источник
0

Сначала вам нужно Fetchудаленное (определенная ветвь), затем вы можете создать локальный br и отслеживать его с помощью этой удаленной ветки, используя вашу команду (то есть checkoutс -b и --track).

Рахил Хасан
источник
0

Вы должны пойти подмодуль DIR и запустить git status.

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

  1. git reset .

  2. git checkout .

  3. git fetch -p

  4. git rm --cached submodules // submoudles ваше имя

  5. git submoudle add ....

knight2016
источник
0

Вы можете использовать следующие команды: git remote update, git fetch, git checkout -b branch_nameA origin: branch_nameB

Я думаю, может быть, это из-за вашей локальной ветви не может отслеживать удаленную ветку

кан
источник