#git #remote-branch
#git #удаленная ветка
Вопрос:
Я хочу получить ветку с удаленного устройства, но имя моей ветки не начинается с remote name, например:
git checkout -b BRANCH origin/BRANCH
В некоторых случаях это работает, но в некоторых случаях я получаю эту ошибку:
fatal: git checkout: updating paths is incompatible with switching branches.
пока я уверен, что у удаленного есть эта ветка, и это работает:
git checkout -b origin/BRANCH
После этого я должен переключиться на другую ветку и переименовать источник ветки / BRANCH в BRANCH, а затем снова переключиться на BRANCH…
Я хочу знать, что означает эта ошибка.
Ответ №1:
Вот почему вы получаете сообщение об ошибке, которое вы.
git checkout
может выполнять одно из двух действий. Если вы просто укажете ветку и не укажете никаких путей, то она переключит вашу текущую ветку на указанную вами ветку.
git checkout mybranch # switch to branch 'my branch'
Если вы укажете некоторые пути, то git извлечет эти пути либо из индекса, либо, если вы укажете ветвь, из заданной ветви.
git checkout myfile # checkout 'myfile' from index
Как вы можете видеть, существует потенциальная двусмысленность. Что должно произойти, если у вас была вызвана ветка myfile
или вызван файл mybranch
?
Способ, которым git устраняет эту двусмысленность, заключается в том, что он сначала проверяет параметр, чтобы увидеть, соответствует ли он ветви, и если нет, то предполагается, что параметр ссылается на файл. Если у вас была ветка и файл с тем же именем, вы можете заставить git обрабатывать параметр как файл с этим синтаксисом.
git checkout -- myfile # treat 'myfile' as a file
-b
Опция, которая создает новую ветвь, действительна только при использовании формы переключения ветвей checkout
, а не при извлечении указанных файлов из индекса.
git checkout -b newbranch myfile # Illegal. I can't use `-b` when
# I'm checking out files.
Если вы попытаетесь git checkout -b newbranch origin/BRANCH
и получите эту ошибку, это означает, что origin/BRANCH
название какой-либо ветви, которая у вас есть, не совпадает, поэтому git предположил, что вы, должно быть, ссылаетесь на файл.
Чтобы показать, какие ссылки на удаленные ветви у вас есть, вы можете сделать git branch -r
. Если у вас нет ссылки на ветку, которая, по вашему мнению, должна существовать, вам, возможно, придется выполнить git fetch
, чтобы извлечь ее с удаленного устройства.
Если вы указываете, -b
но не указываете название ветви, чтобы отключить новую ветвь, git по умолчанию использует HEAD
, то есть фиксацию, в которой находится ваша текущая извлеченная ветвь.
git checkout -b origin/BRANCH
Это создает новую локальную ветку, вызываемую origin/BRANCH
на основе вашего текущего коммита. Это, в лучшем случае, может вызвать у вас некоторое замешательство и звучит совсем не так, как будто это то, чего вы хотите.
Ответ №2:
git checkout
переключается на некоторую ветку, она не извлекает ее из удаленного репозитория. git checkout -b
также создает ветку. Чтобы извлечь ветку из удаленного репозитория, используйте git fetch
.
Комментарии:
1. Аааа, значит, в таких случаях я должен запускать
git fetch origin
раньшеgit checkout -b BRANCH origin/BRANCH
. Спасибо, это решило мою проблему. (Я неправильно понял значение выборки )2. ДА. В более новых версиях git последнее может быть сокращено до просто
git checkout BRANCH
.3. но не для других удаленных устройств (не origin)