выборка удаленной ветви с тем же именем

#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)