【问题标题】:got 'fatal: branch 'master' does not exist' in gitgit'致命:分支'master'在git中不存在'
【发布时间】:2017-10-24 16:13:21
【问题描述】:

用了一段时间git,很强大很漂亮..

但也有一些困惑:

在我初始化一个 git repo 之后,它应该在分支 master 下,不是吗?

但是git branch -a,我什么都没有。
当我尝试为我的分支设置上游时,我得到了fatal: branch 'master' does not exist

users@debian MINGW64 ~/Desktop/taste
$ git init
Initialized empty Git repository in C:/Users/users/Desktop/taste/.git/

users@debian MINGW64 ~/Desktop/taste (master)
$ git remote add origin git@gitee.com:greedev/Test.git

users@debian MINGW64 ~/Desktop/taste (master)
$ git branch -u origin/master
fatal: branch 'master' does not exist

users@debian MINGW64 ~/Desktop/taste (master)
$ git branch -a

users@debian MINGW64 ~/Desktop/taste (master)
$ git fetch
The authenticity of host 'gitee.com (120.55.226.24)' can't be established.
ECDSA key fingerprint is SHA256:FQGC9Kn/eye1W8icdBgrQp+KkGYoFgbVr17bmjey0Wc.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'gitee.com,120.55.226.24' (ECDSA) to the list of know                n hosts.
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 7 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (7/7), done.
From gitee.com:greedev/Test
* [new branch]      master     -> origin/master

users@debian MINGW64 ~/Desktop/taste (master)
$ git branch -a
  remotes/origin/master

users@debian MINGW64 ~/Desktop/taste (master)
$ git branch -u origin/master
fatal: branch 'master' does not exist

【问题讨论】:

    标签: git git-branch


    【解决方案1】:

    TL;DR

    此时您可以git checkout master

    更长的描述(但仍然没有那么长)

    你这样做很艰难。

    将来,而不是:

    mkdir repo
    cd repo
    git init
    git remote add origin <url>
    git fetch origin
    git checkout master
    

    你可以简单地运行:

    git clone <url> repo
    

    因为上面的六个命令几乎就是 git clone 所做的。

    在前三个步骤之后——创建一个新的、完全空的存储库——你有一个处于特殊状态的存储库:它没有提交,所以它没有分支。同时,它确实有一个当前分支,即master

    也就是说,当前分支是一个不存在的分支

    这种状态不寻常,但很正常。如果您运行git checkout --orphan newbranch,您会将您的 Git 存储库置于相同的状态:1 在一个不存在的分支上。一旦有提交哈希存储在分支名称下,就会创建分支。

    当你运行git checkout &lt;name&gt; 并且没有名为&lt;name&gt; 的分支时,Git 会检查是否有正好一个 远程跟踪分支,例如origin/&lt;name&gt;。如果是这样,Git 会创建一个名为&lt;name&gt; 分支,该分支指向与origin/&lt;name&gt; 相同的提交,并将origin/&lt;name&gt; 作为其上游。

    由于这最后一步——git checkout mastermaster 实际上还不存在——是git clone 的最后一步,git clone 还将创建一个新分支master 来跟踪远程跟踪分支@ 987654338@.


    1请注意,您保留当前索引/暂存区内容。对于新的空存储库也是如此,但由于它是一个新的空存储库,因此索引/暂存区也是空的,“保留空集”感觉不像保留。

    【讨论】:

    • 谢谢。你是传奇。所以,在实践中,git clone 正在做6_step 所做的事情。对?明白了。
    • 它正在执行所有六个步骤(尽管它可以跳过mkdir 并使用现有的空目录,如果你告诉它这样做的话)。还有额外的git clone 参数可以根据需要修改某些步骤,最后的git checkout 并不总是用于master,但这是通常的模式。
    【解决方案2】:

    运行git init 后,您看到的master 并未完全创建。它不存在,因为它还没有指向任何提交。我曾经读到它是设计好的。但我认为这是一个令人费解的错误。如果你运行git branch,它什么也不返回。

    在您运行 git fetch 之后,后续的 git checkout master 会完成这项工作。相当于:

    git branch master origin/master
    git checkout master
    git branch -u origin/master
    

    【讨论】:

    • 基本上这是正确的,但是当您注意到它是记录在案的行为时,您如何将其视为“错误”,我不明白。当然,由于 OP 正在使用遥控器并获取整个内容,因此只需使用 git clone 即可跳过空仓库的整个问题以及几个不需要的步骤
    • @MarkAdelsberger 因为显然 OP 被master 弄糊涂了,所以造成了不必要的混乱。如果不是错误,可能是设计糟糕的功能。 git clone 不是通用解决方案。在某些情况下,我们需要在现有存储库中添加新的远程,从远程获取,然后使用其上游签出新分支。
    • 谢谢很多人,其实我想知道的是After you run git init, the master you see is not completely created. It doesn't exist as it hasn't pointed to any commit yet.你真的给了我很大的帮助。O(∩_∩)O..
    • @ElpieKay - 你不知道为什么它是这样的事实并没有使它“不必要”。您对设计的不喜欢并不会使它成为错误。设计有时会让用户感到困惑这一事实并不会使其成为错误。至于clone,我很清楚它何时适用,当然从未说过它是通用的;但是,如果您要向现有存储库添加遥控器,那么它不是没有分支的全新存储库,因此与此问题无关。也许你应该停止不必要的争论。
    • @MarkAdelsberger 支持并感谢您的评论。正如我所观察到的,您是 Stackoverflow 的优秀贡献者。但是,你现在是在教我对我每天都在使用的工具的感受吗?我根据 OP 的步骤给出了一个解决方案,但我从未判断 git-clone 是一个糟糕的解决方案。请不要再专横了。
    【解决方案3】:

    您可能正在寻找git checkout master 以及一些教程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-01
      • 2015-01-16
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      • 2012-05-22
      相关资源
      最近更新 更多