致命错误:'master'不是有效的对象名称

287

我有一个运行git 1.7的私人服务器 当我

git init 

一个文件夹并不会创建主分支。 因为当我这样做时:
git branch 

它没有列出任何内容。 当我执行以下操作时:

git --bare init

它创建了文件。 当我输入时

git branch master 

它说:

fatal: Not a valid object name: 'master'.

4
尝试创建新分支时,使用命令git branch newbranch将得到相同的结果。 - Soren
澄清一下:正如你所说,“master”不存在,因此“git branch master”试图创建它,就像“git branch newbranch”一样。唯一的区别是“master”可能是你当前的分支,例如如果你运行“git log”,它会显示 fatal: your current branch 'master' does not have any commits yet - Denis Howe
10个回答

421
当我执行git init命令时,它不会创建一个主分支。这是正确的行为,因为在提交任何内容之前,Git不会创建master分支。当我执行git --bare init命令时,它会创建文件。非裸的git init命令也会在您项目的根目录中的隐藏的.git目录中创建相同的文件。当我输入git branch master命令时,它会显示“fatal: Not a valid object name: 'master'”。这也是正确的行为,因为在提交之前,没有master分支。如果您想要问一个问题,那么我假设您想问如何创建初始提交和master分支。您需要将一个或多个文件添加到您的目录,并使用git add命令将它们准备好进行提交。然后使用git commit命令创建您的初始提交和master分支。请注意保留原文中的HTML标签。

5
那么,如果我根本不想要一个名为“master”的分支指针呢?如果我想把它称为“main”怎么办?没有办法从不同的名称开始第一个分支指针吗?没有“git init”参数吗?我能否更改.git/HEAD中列出的名称?还有其他文件需要修改吗? - Jemenake
1
@Jemenake 然后初始化您的存储库,进行提交并重命名分支。如果您真的想避免创建“master”分支,请编辑.git/HEAD,将refs/heads/master更改为refs/heads/main,但是没有任何理由这样做。只需在第一次提交后重命名您的分支即可。 - user229044
36
您可以使用git checkout -b <分支名>来更改HEAD,而无需编辑文件。 - Superfly Jon
1
最后一部分非常重要,TFS GIT带有完全未初始化的git仓库。因此,在使用SourceTree进行第一次克隆之后,什么都不起作用,很长时间都无法弄清楚,直到“然后使用git commit创建您的初始提交和主分支”。真的没有办法在没有初始提交/推送的情况下拥有主本地/远程吗? - Pawel Cioch
1
这里有一个关于“在你提交之前,没有主分支”的问题。那么为什么在此之前'git status'显示'On Branch Master'呢? - Tinu Jos K
显示剩余3条评论

47

将Superfly Jon的评论复制到答案中:

要在master分支上创建一个新的分支而不进行提交,您可以使用以下命令:

git checkout -b <branchname>

但是当你运行命令git branch --all或git branch时,你看不到任何人。 - nativelectronic
@nativelectronic 没错。即使对我来说,当我执行 git branch -all 或 git branch 命令时,它也不起作用。 - GSN
@GSN git branch 只显示有提交记录的分支。尝试使用 git status 命令来查看当前分支名称,即使它没有任何提交记录。 - krubo
假设原始问题本质上是“我不能从空的存储库分支吗?”,这是正确的答案,因为它简明扼要地表明了这是可能的。我还认为,在填充新存储库但策略防止直接提交到主/主控分支进行代码审查的情况下,此答案具有额外的价值。这避免了将文件添加到永远不会合并的本地分支的情况。 - mark sabido

32

一旦您进行了第一次提交,Git会创建一个主分支。如果仓库中没有代码,就没有需要创建分支的必要。


4
但是你需要创建一个新的分支才能将修改推送到主分支。 - Soren
1
这里有一个关于“Git在第一次提交后创建主分支”的问题。那么为什么“git status”在所有这些之前显示“On Branch Master”? - Tinu Jos K

20

在创建新分支之前,您需要在主分支上至少提交一次。


19

首先,当你创建一个“裸仓库”时,你不会在其中进行任何工作(它不包含工作副本,因此git branch命令无用)。

现在,即使执行了git init,也没有master分支的原因是没有提交:当你创建第一个提交后,你将拥有一个master分支。


1
好的,那很清楚。但是当我提交时,它会显示:致命错误:空标识符。 - Roy van Zanten
这些文件在我的本地机器上,我想将它们推送到服务器仓库。我刚刚看到它将分支推送到了服务器。但是没有文件。当我在服务器上进行检出时,它会显示我不在工作树中。 - Roy van Zanten
另外...我在服务器存储库上执行了git --bare init。 - Roy van Zanten
@RoyvanZanten 如果你想通过检查文件来查看它们,那么你真的不想要一个裸仓库。为了让你的世界变得有意义,你需要学习工作副本和仓库之间的区别。发生的事情是,你成功地将文件推送到服务器上,这将把它们放入服务器上的仓库(即.git目录的内容)中。为了理解我的意思,为什么不尝试从服务器进行全新的git克隆呢?我敢打赌你的更改将会在其中。 - Borealid
1
当您进行第一次提交时,@Tick20,它将变为“master”。在有提交之前,没有名为“master”的分支。在实现方面,.git/HEAD 可能包含 ref: refs/heads/master,但 .git/refs/heads/master 不存在。 - Borealid
显示剩余6条评论

3
这是因为您还没有提交任何内容。
首先,您需要使用git add .git add <file-name>将文件添加到缓存区, 然后使用git commit -m "committed successfully"提交更改。
现在您就可以创建一个新分支了。

1
无法工作。我想创建一个新的存储库,然后创建一个名为“feature-branch”的新分支,在此分支中编写代码,提交,然后将此“feature-branch”合并到“master”中。我执行以下操作:mkdir testrepo 然后 cd testrepo 然后 git init 然后 git add . 然后 git commit -m "committed successfully" 然后 git branch feature-branch,但我仍然收到相同的错误提示:“fatal: not a valid object name: 'master'”。 - izogfif

0
使用在线git服务创建一个已经存在文件和所需分支的仓库。
在本地尝试时遇到了问题。
git init --bare new.git
cd new.git
git checkout -b next 
fatal: this operation must be run in a work tree

搜索在线会得到很多好的和坏的建议,但没有确定的解决方案。
我做了以下几步:
在一个喜欢的git服务上创建一个初始的公共存储库。我喜欢GitHub。 将默认的初始分支设置为你喜欢的任何分支:我喜欢"next"。 确保包括创建一个README.md文件和一个你选择的许可证文件。
你的存储库几乎是空的,你可以创建一个本地的裸克隆,它已经有一个分支。
git clone --bare <gitURL> myrepo.git

Cloning into bare repository 'cpp.git'...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (5/5), 12.68 KiB | 1.06 MiB/s, done.

cd myrepo.git
git worktree add /work/suites/cpp/next next
Preparing worktree (checking out 'next')
HEAD is now at 4255e58 Initial commit

或者,你可以在本地创建一个git仓库,但不是一个裸仓库,添加你的第一个文件,然后将其转换为裸仓库。你可以使用搜索引擎找到执行此操作的说明。

0

请尝试在主分支中创建任何文件并提交。然后创建其他分支。应该可以正常工作。


0

不是传统的答案,但我也有一个解决方案。 对于这个完全相同的问题,我注意到当我在已经存在的存储库中创建另一个存储库时,会出现这个问题。

所以如果你克隆了一个存储库,然后再次执行git init,就会导致这个问题。然后你需要删除整个文件夹并重新克隆它。谢谢。


0

只需执行 git checkout -b branchname 即可创建分支。


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