Git 我能';t签出一个特定的分支机构,";“分离头状态”;

Git 我能';t签出一个特定的分支机构,";“分离头状态”;,git,github,Git,Github,我和我的朋友有一份他创建的回购协议。然后,他创建了一个名为“lexer”的分支,供我们研究 问题是,虽然他可以在master和lexer之间来回切换,但对我来说根本不起作用 最终我只是重新开始(rm-rf repo,然后克隆了repo),但仍然无法签出lexer分支 在新克隆的回购协议上: git分行给出: $ git branch * master $ git checkout lexer $ git status On branch master Your branch is up-to-

我和我的朋友有一份他创建的回购协议。然后,他创建了一个名为“lexer”的分支,供我们研究

问题是,虽然他可以在master和lexer之间来回切换,但对我来说根本不起作用

最终我只是重新开始(
rm-rf repo
,然后克隆了repo),但仍然无法签出lexer分支

在新克隆的回购协议上:

git分行
给出:

$ git branch
* master
$ git checkout lexer
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
git checkout lexer
提供:

$ git branch
* master
$ git checkout lexer
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
我可以签出origin/lexer,但我最终处于分离的头部状态

$ git checkout origin/lexer master
Note: checking out 'origin/lexer'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
对我来说,通过这样做来推动lexer分支是可能的

git push origin HEAD:lexer
但是,我真的很想把这件事解决掉。这太奇怪了,对他有效,但对我无效?他说他也没有从git回购中得到任何本地更改


有人有任何线索吗?

我想大胆猜测一下,您的顶层有一个名为
lexer
的目录。由于
git checkout
用于切换分支和重置树中的文件,因此它可能检测到您没有名为
lexer
的分支,但您有路径并选择第二种模式。 它适用于你的朋友,因为他已经有了一个
lexer
分支

最简单的解决方法可能是使用
git branch
创建分支

git branch --track lexer origin/lexer
我应该为你做那件事。然后可以使用
git checkout
切换到它

另一个选项可能是使用
--
标志进行git签出。我还没有试过,但我认为应该可以:

git checkout lexer --

添加
--
时,它前面的单词始终被视为分支/提交/树,后面的单词被视为路径。

您无法签出
lexer
,因为您的本地存储库中没有分支(当然还有同名文件夹)。您只有远程分支“origin/lexer”。 首先,您必须创建本地分支:

git checkout -b lexer origin/lexer

关于这个问题的一个很好的解释是:

你进入了一个分离的头部状态,因为
origin/lexer
是一个远程跟踪分支,因此是只读的。您只需要签出lexer,并在这方面做您的工作。然后,当您按下时,
origin/lexer
将被更新


编辑:重新阅读您的问题,我发现您试图签出lexer,但最终还是留在master上。奇怪的是,
git checkout
正在悄无声息地失败。尝试
git checkout-t origin/lexer

当您这样做时:
git checkout origin/lexer master
您只需更改
即可指向我们
远程
分支中的最新提交。这是一个只读分支

如果您想了解头部是什么,请阅读以下内容:

在您的情况下,您只需执行以下操作:

使用包含所有分支和标记的最新代码更新存储库 现在您应该在本地拥有最新的分支

删除旧的本地分支 !!!重要提示:
如果您进行了修改,但没有推送它们,请不要删除本地分支

git branch -D lexer 
签出所需的分支
现在,您已经从远程分支签出了名为lexer的本地分支了另一个猜测:您有一个同名的标记,所以

git签出lexer

实际上签出的是标签,而不是分支

您可能想要这样:

git checkout -t origin/lexer
从git手册:

为方便起见,-track不带-b意味着创建分支

-t、 --跟踪。。。创建新分支时,请设置“上游”配置。。。 如果未给出-b选项,则新分支的名称将从远程跟踪分支派生


TLDR:这可能只是个问题。而不是

git checkout origin/mybranch
尝试:


给定以下命令,git将执行以下步骤:

git checkout origin/mybranch
  • git在本地回购协议中查找名为“origin/mybranch”的分支
  • 如果找不到它,它将在可用的遥控器中查找名为“origin/mybranch”的分支
  • 也找不到,它尝试将其视为提交标记,并根据特定提交找到标记“origin/mybranch”。它以分离状态为您检查提交
  • 但那不是你想要的!你想要一个叫做“mybranch”的分支。如果只有一个远程设备具有这样的分支(并且本地没有什么可以混淆的东西),那么git将假定您是指这种用法,为您填写

    git checkout -b <branch> --track <remote>/<branch>
    
    git签出-b--跟踪/
    
    如果找不到具有匹配名称的分支,则默认为:

    git checkout [--detach] <commit> 
    
    git签出[--detach]
    
    这就是分离的头部信息的来源


    请参阅,并仔细注意
    vs

    我只是替换了命令

    $ git checkout v4.9.0
    


    这对我来说很有效。

    这个答案完全是错误的-对于当前版本的git,在(唯一的)远程上签出一个不存在的本地分支并使用相应的分支名称,默认情况下将创建并签出该分支的本地版本。请参阅:“如果未找到,但在一个远程(调用它)中确实存在具有匹配名称的跟踪分支…”事实上,这是git的默认行为,但您可能错过了更改此行为的文本
    (当然还有一个同名文件夹)
    ,这是这里的主要问题。你可以看到被接受的答案说的完全一样(但更完整)。所以,不,我不认为我的答案是完全错误的……”“你不能签出lexer,因为你的本地存储库中没有分支[…]首先你必须[…]”是“完全错误”的部分。是的,文件夹似乎是问题所在,此答案的其他部分不相关。如果存在同名的分支和标记,第一种解决方法也有效。这对我来说很有效,但我仍然不知道冲突发生在哪里。我创建了一个全新的分支来保存当前的更改,并将其推到了我的r
    $ git checkout v4.9.0
    
    $ *git checkout -b v4.9.0