Это предположение, но я воспроизвел поведение:
sh-3.2$ mkdir txx
sh-3.2$ cd txx
sh-3.2$ git init
Initialized empty Git repository in ...
sh-3.2$ echo test branch name thing > README.md
sh-3.2$ git add README.md
sh-3.2$ git commit -m initial
[master (root-commit) 7dc0be2] initial
1 file changed, 1 insertion(+)
create mode 100644 README.md
sh-3.2$ echo this is a file named dev > dev
sh-3.2$ git add dev
sh-3.2$ git commit -m 'add file named dev'
[master ac01ba6] add file named dev
1 file changed, 1 insertion(+)
create mode 100644 dev
sh-3.2$ git remote add origin .
sh-3.2$ git update-ref refs/remotes/origin/master master
sh-3.2$ git update-ref refs/remotes/origin/dev master
sh-3.2$ echo foo >> dev
sh-3.2$ git checkout dev
Кажется, здесь ничего не произошло, но на самом деле что-то произошло: файл dev
был извлечен, разрушительно. Вот его содержание:
sh-3.2$ cat dev
this is a file named dev
и вот подтверждение того, что мы все еще на master
:
sh-3.2$ git status
On branch master
nothing to commit, working tree clean
working tree clean
является следствием уничтожения обновленного dev
, заменив его копией, извлеченной из индекса, на git checkout
.
Обратите внимание, что для всего этого требуется чуть более старая версия Git:
sh-3.2$ git --version
git version 2.20.1
Более современная. говорит нам о проблеме. Если вы выполните то же самое в Git 2.24, то получится:
$ git checkout dev
fatal: 'dev' could be both a local file and a tracking branch.
Please use -- (and optionally --no-guess) to disambiguate
Именно из-за этого git checkout
теперь представляет собой две отдельные команды, git switch
и git restore
. Использование git switch
:
$ git switch dev
M dev
Branch 'dev' set up to track remote branch 'dev' from 'origin'.
Switched to a new branch 'dev'
делает желаемую вещь.