我在本地克隆了一个私有存储库,它有 3 个分支——master、dev 和 staging。当它被克隆时,我在主分支中。当我列出分支时:
git branch -a
Run Code Online (Sandbox Code Playgroud)
我看到了所有的分支。当我运行时:
git checkout dev
Run Code Online (Sandbox Code Playgroud)
什么也没发生,我仍然在主分支中。我试图拉取并获取其他分支而没有运气。我不知道如何切换到任何其他分支。
这是一个猜测,但我已经重现了该行为:
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
Run Code Online (Sandbox Code Playgroud)
这里似乎没有发生任何事情,但实际上,确实发生了一些事情:文件dev
被破坏性地检出。以下是其内容:
sh-3.2$ cat dev
this is a file named dev
Run Code Online (Sandbox Code Playgroud)
这是我们仍在继续的确认master
:
sh-3.2$ git status
On branch master
nothing to commit, working tree clean
Run Code Online (Sandbox Code Playgroud)
这working tree clean
是破坏更新的结果dev
,用从索引中提取的副本替换它git checkout
。
请注意,所有这些都需要一个稍旧版本的 Git:
sh-3.2$ git --version
git version 2.20.1
Run Code Online (Sandbox Code Playgroud)
一个更现代的人告诉我们这个问题。在 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
Run Code Online (Sandbox Code Playgroud)
这种事情的原因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'
Run Code Online (Sandbox Code Playgroud)
做想要的事情。
归档时间: |
|
查看次数: |
1379 次 |
最近记录: |