【问题标题】:git checkout master does not switch branch - repository broken?git checkout master 不切换分支 - 存储库损坏?
【发布时间】:2016-03-21 03:43:10
【问题描述】:

tl;drgit checkout master 没有切换到 master 分支,没有给出任何错误或任何输出,我不知道为什么。任何其他分支都可以正常工作。

我有一个 git 存储库,它由分支 developmentmaster 组成。我对存储库进行了全新克隆,默认签出分支development

$ git clone <REPO-URL> --branch development
$ git branch -a
* development
origin/HEAD -> origin/development
origin/development
origin/master
$ git show-ref 
656c781c2affc26792f857baf8e232de07101535 refs/heads/development
656c781c2affc26792f857baf8e232de07101535 refs/remotes/origin/HEAD
656c781c2affc26792f857baf8e232de07101535 refs/remotes/origin/development
cfee1a1761642453edf5d001565f23b50243ff09 refs/remotes/origin/master

ref master 指向是正确的,该提交确实存在并且是我的 master 分支的最新提交。

到目前为止,一切看起来都很正常,但是当我尝试切换到 master 时,这种情况正在发生:

$ git checkout master
$ git branch 
* development

结帐没有消息,没有错误,什么都没有,分支没有切换。

到目前为止我尝试过的事情:

  • 从同一个提交创建第二个分支master2 => 签出工作正常。
  • 删除并重新创建本地和原点的主分支 => 再次无法结帐
  • git checkout -b master --track origin/master => 有效,但我认为没有必要使用此命令,因为这是 git checkout master 应该自动执行的操作
  • 提交并推送到主作品,但不改变结帐问题
  • 我尝试了几个git版本(1.9、2.2)和机器(linux、windows),到处都是问题。

还有什么想法吗?我错过了什么?我的存储库坏了吗?我该如何解决这个问题?

【问题讨论】:

  • 那么您希望git checkout mastergit checkout -b master --track origin/master 那样创建一个本地跟踪分支吗?您不想创建与远程主分支不同的本地主分支,对吗?你是绝对正确的,你的命令应该可以工作,前提是只有一个遥控器具有匹配名称的分支。真不知道怎么一点错误信息都没有……

标签: git git-checkout


【解决方案1】:

如果您的 repo 有一个与分支名称相同的文件夹或文件名,那么您将需要:git checkout xyz --,最后加上额外的--。它告诉 git 使用分支或提交,而不是尝试使用文件夹/文件名。

在另一个 * 帖子中找到了答案:Git change branch when file of same name is present

【讨论】:

  • 这就是我使用 Magento 时发生的事情。有一个名为“dev”的文件夹,我们还使用了一个名为“dev”的分支。所以git checkout dev 实际上是检查dev 文件夹的内容而不是dev 分支。谢谢:)
【解决方案2】:

当源树中有一个文件夹 master 时,我看到过类似的情况。不幸的是,我没有找到一种方法来告诉 git 将该值解释为一个分支。重命名文件夹为我解决了这个问题。

【讨论】:

  • 也遇到了这个问题,并没有意识到在我当前的工作目录中存在与目标分支名称匹配的目录。如果您切换目录,例如cd 到一个子目录,你也可以切换分支,没问题。
  • 无需重命名文件夹。只需将-- 附加到 Nick 的答案中指出的命令即可。
【解决方案3】:

存储库中的本地主分支与存储库中的任何其他本地分支没有区别。您将存储库克隆到您的开发分支,这是您拥有的唯一本地分支。因此,如果您尝试结帐到本地 master 分支,git 会说它不存在。

如果您希望 development 和 master 本地分支最初都相同,您可以执行以下操作之一:

将你的 repo 下载到 master 分支,并创建一个本地开发分支:

git clone <repo_url>
git checkout -b development

或将您的 repo 下载到开发分支,并创建一个本地主分支:

git clone <REPO-URL> --branch development
git checkout -b master

【讨论】:

  • 我认为,从他所说的产生目标结果的git checkout -b master --track origin/master 行中,他想创建一个跟踪分支。您的代码给出了完全相等的分支(正如您所指出的)。您也没有解释根本没有错误消息。
【解决方案4】:

接受的答案(重命名文件夹)有效。如果您不想这样做,这是我在git version 2.14.1.windows.1 上测试的解决方法。

删除有问题的文件夹。

执行git branch &lt;the branch you had trouble switching to&gt;

执行git branch &lt;your original branch&gt;

执行git checkout -- . 撤消删除。

现在您可以毫无问题地进出您想要的分支,即使 repo 中有一个与分支命名相同的文件夹也是如此。如果你执行git branch,你会注意到分支出现在分支列表中

【讨论】: