【问题标题】:Why does git switch/checkout not switch branch?为什么 git switch/checkout 不切换分支?
【发布时间】:2020-06-30 10:25:20
【问题描述】:

我有两个本地分支机构,mastertest。我想从master切换到test

如果我使用git checkout test,控制台会显示

你的分支是最新的'origin/master'

我还在master 分支。

如果我使用git switch test,控制台会显示

致命:缺少分支或提交参数`

我还是在master 分支。

这里发生了什么?

这就是我所做的:

  • git checkout -b 'test' → 创建并切换到test
  • git checkout master → 切换到master
  • git checkout testgit switch test → 我想切换回 test,但这不起作用。

【问题讨论】:

  • 我使用 git checkout -b 'test' 创建了测试分支,之后没有进行任何更改。所以答案应该是否定的。
  • 它列出了我的本地分支 master 和 test 以及一堆远程分支。
  • 是的 git checkout -b 'test' 切换到测试。之后我切换回master,现在想再次切换回测试。但这不起作用。
  • 但是在你的问题中你想切换到test 分支。我在这里有点困惑,无法使用 git checkout test 重现您的输出
  • 我编辑了我的问题以使其更清晰

标签: git git-branch git-checkout


【解决方案1】:

[我跑了]

git checkout -b 'test'

我不清楚你为什么将test 放在单引号内。如果你的命令行解释器(例如 bash)删除单引号,你就可以了。如果它没有(例如cmd.exe,显然),您将得到一个名称为'test' 的分支,包括单引号字符

要使用该分支名称,您必须继续引用它:

git switch 'test'

因为分支的名称实际上是'test',而不是test

一般建议

通常,如果您有 Git 2.23 或更高版本,请使用新命令(git switchgit restore)而不是旧命令(git checkout)。旧的仍然有效,但它会产生令人困惑的行为。

特别是,旧的git checkout 命令可以执行多个不同的工作,具体取决于您为其提供的参数:

  • git checkout master 将切换到分支master

  • git checkout -- master 将从当前分支恢复名为master文件

到目前为止,一切正常。但是旧的git checkout 命令有一个我认为是相当大的缺陷。如果你运行:

git checkout xyzzy

xyzzy 不是 分支 名称,git checkout 认为尝试它就像你已经运行过一样:

git checkout -- xyzzy

xyzzy 视为文件(或路径)名称,并尝试从索引中提取xyzzy 文件或xyzzy/* 文件。因此,如果您没有有一个名为test分支,但有一个名为test的文件或一大堆文件名字都以test/git checkout开头的人不会抱怨没有test分支。

使用git switch,您收到投诉。您将不会意外地从git checkout 获得git restore 行为。

我认为这就是您的情况:您有一个名为 test 的文件或文件夹,以及一个名为 'test' 的分支(带单引号),并且您正在让 Git 恢复该文件命名为test 而不是切换到名为'test'的分支。

【讨论】:

  • 但是如果 git banch 打印 test 而不是 'test'
  • 如果git branch 列出的名称test 没有单引号,那么git switch test 应该可以工作并且应该切换到分支测试(前提是您处于允许切换的状态—切换对索引状态施加某些约束)。还要注意名称中的其他非打印字符。例如,如果您在创建分支时输入一个零宽度不间断空格字符作为分支名称的一部分,那么您在使用它时必须输入相同的零宽度不间断空格字符。
猜你喜欢
  • 2016-03-21
  • 2010-10-31
  • 2011-08-25
  • 2021-06-12
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多