git checkout master无法切换分支 - 仓库损坏?

23
tl;dr: git checkout master不能切换到master分支,没有任何错误或输出信息,我不知道原因。其他分支都可以正常使用。

我有一个包含分支developmentmaster的git仓库。我进行了一次全新的克隆操作,默认检出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 主分支是正确的,该提交确实存在,并且是我的主分支最新的提交。

到目前为止,一切看起来正常,但当我尝试切换到主分支时,出现了以下情况:

$ git checkout master
$ git branch 
* development

从checkout没有任何消息,没有错误,也没有切换到分支。

我尝试过的事情:

  • 从同一提交创建第二个分支master2 => checkout正常工作。
  • 删除并重新创建本地和远程主分支=>仍然无法进行checkout
  • git checkout -b master --track origin/master =>工作正常,但我认为不需要使用此命令,因为这是git checkout master应自动执行的操作。
  • 提交并推送到主分支可以正常工作,但不会更改checkout问题
  • 我尝试了几个git版本(1.9、2.2)和机器(linux、windows),问题在各个地方都出现。

有什么进一步的想法吗?我漏掉了什么?我的代码库是否损坏?我该如何修复?


所以你想要 git checkout master 创建一个本地的跟踪分支,就像 git checkout -b master --track origin/master 那样?你不想创建一个与远程主分支不同的本地主分支,对吧?你是绝对正确的,只要有一个远程分支与匹配名称即可。我真的不知道为什么没有任何错误消息…… - Nils_M
4个回答

33
如果您的存储库中有一个与分支名称相同的文件夹或文件名,则需要在末尾添加额外的--,并使用命令git checkout xyz --。这告诉Git使用分支或提交而不是尝试使用文件夹/文件名。
在另一个stackoverflow帖子中找到了答案:Git change branch when file of same name is present

当我使用Magento时,发生了这样的事情。有一个名为“dev”的文件夹,我们还使用了一个名为“dev”的分支。因此,git checkout dev实际上是检出dev文件夹的内容,而不是dev分支。谢谢 :) - user1105491

20

当源代码树中存在一个“主目录(folder master)”时,我遇到过类似的情况。不幸的是,我没有找到一种方法来告诉git将该值解释为分支。将该目录更名后,问题得到了解决。


5
我也遇到了同样的问题,并没有意识到在我的当前工作目录中有与目标分支名匹配的目录。如果您切换到另一个目录,比如进入一个子目录,那么您就可以轻松地切换分支了。 - Phil
1
不需要重命名文件夹。只需按照Nick的答案中指出的,在命令后面添加“--”即可。 - josch
这里。这就是问题所在。 - Jeremy Leipzig

4

你仓库中的本地主分支和其他本地分支一样。你将仓库克隆到了开发分支,这是您唯一的本地分支。因此,如果您尝试检出本地主分支,Git会说它不存在。

如果想要最初同时拥有开发分支和主分支,你可以采取以下方法之一:

将你的代码下载到主分支,并创建一个本地的开发分支:

git clone <repo_url>
git checkout -b development

或者将您的仓库下载到开发分支,并创建本地主分支:
git clone <REPO-URL> --branch development
git checkout -b master

我认为,从他的代码行 git checkout -b master --track origin/master 来看,他想要创建一个跟踪分支。你的代码给出了完全相等的分支(正如你所指出的)。你也没有解释为什么没有任何错误信息。 - Nils_M

0

被接受的答案(重命名文件夹)是可以解决问题的。如果你不想这样做,这里有一个解决方法,我已经在git version 2.14.1.windows.1上测试过。

删除有问题的文件夹。

执行 git branch <您遇到问题的分支>

执行 git branch <您原来的分支>

执行 git checkout -- . 来撤销删除。

现在,即使在仓库中有与分支同名的文件夹,您也可以轻松地切换到所需的分支,而没有任何问题。如果执行 git branch,你会发现分支出现在分支列表中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接