为什么我的'git branch'没有主分支?

117

我是一个 Git 新手,经常听到“master”分支。这个“master”只是惯例名称还是像 HEAD 一样有特殊含义?

当我在克隆版本库上运行 git branch 时,只能看到一个分支 - 我所在的那个分支。没有看到“master”。如果我像教程或指南中经常看到的那样输入 git checkout master,会发生什么呢?

error: pathspec 'master' did not match any file(s) known to git.

我很困惑,为什么我的克隆版本没有一个似乎每个人都认为它总是存在的 master 分支。

11个回答

92

大多数Git存储库使用master作为主(默认)分支 - 如果通过git init初始化新的Git存储库,则默认情况下将检出master

但是,如果您克隆一个存储库,则您拥有的默认分支是远程 HEAD 指向的任何内容(HEAD 实际上是指向分支名称的符号引用)。因此,如果您克隆的存储库的 HEAD 指向,假设是foo,则您的克隆只会拥有foo 分支。

您克隆的远程存储库仍然可能有一个master分支(您可以使用git ls-remote origin master命令检查),但是默认情况下您不会创建该分支的本地版本,因为git clone只会检出远程存储库的HEAD分支。


6
如果存在的话,如何从远程代码库检出主分支? - Bunyk
1
如何将HEAD设置为master - Matt Smith
36
我使用 git init 创建了我的代码库,但没有创建主分支。在 Github 上,分支会自动创建,但在 Bitbucket 上不会。缺失的步骤是: git add .git commit -m "Test", 然后执行 git push -u origin master - Shailen
12
@Amber 我遇到了这个错误:“fatal: master: not a valid SHA1”。 - KK_07k11A0585
3
@Amber git ls-remote origin master 没有显示任何内容。 - Parisa Khateri
检查分支 HEAD 指向:git remote show origin | grep HEAD - logbasex

89

要检出一个本地不存在但在远程仓库中的分支,您可以使用以下命令:

git checkout -t -b master origin/master

谢谢你尝试提供帮助,尽管这个问题很旧。但是你的答案并不是我想问的。 - aberrant80
fatal: Cannot update paths and switch to branch 'master' at the same time. - Raphael Onofre
无法同时更新路径并切换分支。 - Bunyk
在GitHub上固定创建主分支并设置为默认。 - Raphael Onofre

49

master 只是一个分支的名称,除了默认情况下创建新存储库时会创建它之外没有任何神奇之处。

您可以使用 git checkout -b master 命令将其添加回来。


git checkout -b master 只是为我添加了一个新的分支,从当前分支开始。 - nnyby
1
git checkout -b master 会从当前的 HEAD 分支创建一个名为 master 的新分支,如果你在另一个分支上,它将从该分支创建一个 master 分支。但是,如果你已经有了一个 master 分支(例如,你已经删除了它或从未提交过任何内容),那么这个命令将会报错。 - Matt Curtis
2
我的问题是:我是如何意外删除了 master 分支的? - Eric Walker
@EricWalker master 只是一个分支,可以使用 git branch -d master 命令删除。虽然 git 会保护您免于删除当前所在的分支,但没有任何特殊保护 master 分支。更具体地说,很难说你是如何做到的。也许你使用了你的 shell 的 history 命令来查看? - Matt Curtis
3
嗨@MattCurtis,您的答案目前是误导性的。只有当HEAD设置为origin/master时,“git checkout -b master”才能正常工作。在任何其他情况下(例如,您在“develop”上),“git checkout -b master”将创建一个名为“master”的分支,该分支基于当前HEAD位置(例如从“develop”)。您还需要说明哪个分支将成为新分支的最佳选择。@Bunyk在此线程上给出了正确的答案:https://dev59.com/NnA65IYBdhLWcg3wzyBl#21330943 - AVIDeveloper

24

我曾经遇到过一个全新的代码库出现了类似的问题。即使是使用git checkout -b master创建分支也不行。后来发现只有在做了一些修改并提交后,git才会为我创建一个主分支。


2
误导人的是,有些人说我已经有了主分支,但无论我尝试做什么,都会收到错误消息,说我没有主分支。(当我的存储库仍为空时,我试图创建一个dev分支。)通过提交一些东西(任何文件),主分支现在就出现了,我能够继续做其他事情了。我尝试了其他答案中的方法,但没有帮助。这个答案可能适用于许多人。(我在Git中阅读了很多关于哈希的内容。我想如果一开始没有任何东西,就没有什么可以哈希的了。) - Fai Ng

20

在我的情况下,仓库中存在一个develop分支,但没有master分支。因此,我克隆了该仓库,并将新创建的HEAD指向现有的分支。然后,我创建了缺失的master分支,并更新HEAD以指向新的主分支。

git clone git:repositoryname --branch otherbranch
git checkout -b master
git update-ref HEAD master
git push --set-upstream origin master

啊,这就对了...我没有主人或其他什么。首先我添加了一个新文件和初始提交 - 然后做了这个。像魔法一样顺利。 - Dustin Silk
这个很干净,我刚刚运行了最后两个命令。谢谢。 - abdoulsn

13
如果你克隆的是一个新仓库,它可能仍然是空的,在这种情况下: git push -u origin master 应该可以解决问题。
(在我的情况下管用。不确定是否是相同的问题,只是想发帖说一下,以防对其他人有所帮助。)

9
我遇到了同样的问题,找出了问题所在。当您初始化存储库时,实际上并没有任何分支。开始项目时运行git add .然后git commit,主分支将被创建。

如果您没有检查任何内容,则没有主分支。在这种情况下,您需要按照其他人建议的步骤进行操作。


2
执行 "git init",然后执行 "git checkout -b somebranchname",这样就没有主分支了。 - koem
如果文件夹为空,这可能还不够。因此,为了使其正常工作,您应该添加一些文件。这另一个笨拙之处实际上令人失望。 - alehro

1
似乎必须在主分支上至少有一个本地提交才能执行以下操作:
git push -u origin master

如果你执行了 git init . 然后又执行了 git remote add origin ...,你仍然需要执行以下操作:

git add ...
git commit -m "..."

1
如果您从Github Web GUI创建新存储库,则有时会得到名称为“main”而不是“master”。通过从终端使用命令git status,您可以看到您所在的位置。在某些情况下,您会看到origin/main
如果您正在尝试通过CLI将应用程序推送到云服务,则请使用“main”,而不是“master”。
例如:git push heroku main

0

我也遇到了同样的问题。我执行了 "git init",但是没有创建主分支/主干分支。可能是因为我使用了另一个名称的分支,而这个分支成为了默认分支。

对我有效的解决方案是:
  1. 我创建了名为 "main" 的分支

git checkout -b main

  • 我进入了我的目录的选项设置->分支,并将其更改为新的分支“main” enter image description here

  • 通过这个更改,Github本身通知我默认分支(main)落后于其他分支,并打开窗口让我确认PR将更改应用到主分支。随后合并拉取请求。 enter image description here


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