Есть ли способ сделать git checkout и * заставить * аргумент интерпретироваться как имя ветки?

Вы вводите команду «git checkout foo».

Если есть ветка с именем "foo", но нет файла с таким именем, он переключается на эту ветку, а если есть файл с таким именем, но такой ветки нет, он обновляет файл "foo".

Но мне интересно --- есть ли способ ввести команду, чтобы Git безоговорочно интерпретировал "foo" как имя ветки, несмотря ни на что? Это включает (но не ограничивается) спецификацию, согласно которой при отсутствии ветки с именем "foo" операция завершится ошибкой, даже если файл с таким именем существует.

Итак, есть ли способ сделать это?

Спасибо.


person Sophia_ES    schedule 11.11.2014    source источник
comment
Я не знаю способа явно проверить ветку, но есть способ заставить ее явно проверять файл: git checkout -- master   -  person Acey    schedule 11.11.2014


Ответы (3)


Да, из ссылки есть такое использование:

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>…

В вашем случае это сводится к следующему:

git checkout foo --

Здесь foo соответствует <tree-ish>, а -- говорит, что все после этого относится к именам файлов. Итак, если вы используете приведенную выше команду (без имен файлов после --), она завершится ошибкой, если нет древовидной (ветки) с именем foo:

fatal: invalid reference: foo
person Yawar    schedule 11.11.2014
comment
Спасибо. :-) Я только что проверил ваше предложение, и оно прекрасно работает. :-) - person Sophia_ES; 11.11.2014

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

git show-ref --verify --quiet refs/heads/foo && git checkout foo

Это позволит убедиться, что ветка существует, и если она существует, проверьте ее. Да, есть состояние гонки (ветвь может быть удалена между ними), но, надеюсь, на практике это не проблема.

Есть ли лучший способ узнать, существует ли локальная ветка git?

person John Zwinck    schedule 11.11.2014
comment
Большое Вам спасибо. :-) Если бы я мог отметить два ответа как лучший ответ, я бы проверил и ваш, так как он очень близок к второму. И да, условие гонки является решающим фактором --- то, что вероятно не будет проблемой в любой момент времени, однако (а) если я использую это как решение, тем более время проходит, тем более вероятно, что в какой-то момент возникнет редкая ситуация, когда это вызывает проблемы (b) как бы незначительна эта проблема, кто-то другой предоставил ответ, который вообще не имеет этой проблемы. Поэтому ваш ответ занимает очень близкое второе, но все же только второе место. - person Sophia_ES; 11.11.2014
comment
@Sophia_ES: Я согласен с вами - ответ Явара лучше. :) - person John Zwinck; 12.11.2014

Только что проверил поведение git 2.1.2, и проверка всегда интерпретирует имя как имя ветки. Вы можете заставить его быть файлом, используя ./foo.

В вашем случае git checkout foo всегда будет пытаться переключиться на ветку foo.

Если вы хотите, чтобы аргумент был веткой, так что даже если файл соответствует, он не обновляется, вы можете попытаться обмануть git, используя git checkout -B foo foo. Если foo существует, git проверит его и обновит указатель ветки на себя. В противном случае новая ветвь не будет создана, поскольку отсутствует начальная точка.

person viraptor    schedule 11.11.2014