This is a multi-part answer because there are two separate issues here that are tangling together now. Here’s a summary of what we’ll cover:
main
vsmaster
error: src refspec main does not match any
- reconciling separate
main
andmaster
branches
Each of these is in its own section.
main
vs master
Git itself has no special branch names.1 You could use main
, master
, trunk
, or any other name as the name of your first branch. Git has traditionally used the name master
here, but there is a project to make this configurable, so that if you are French or Spanish you can use the name principal
or première
or primero
, or if you prefer Maori, you can use matua
or tuatahi
. Currently, you can do this manually during or after a git init
,2 but the project makes Git just do it automatically, without requiring a second step: If for any reason you want any other name by default, you can configure that.
Meanwhile, GitHub have already chosen to leap ahead and make their default initial branch name main
instead of master
. But this leaves your Git and GitHub’s Git out of sync, as it were. For more about GitHub’s changeover, see
Difference Between Main Branch and Master Branch in Github?
1There are some technical flaws in this kind of claim. As we know, technically correct is the best kind of correct, so let me add a few caveats in this footnote:
-
Merging auto-generates a message of the form
merge branch X into Y
when you are on branchY
and rungit merge X
. However, when you’re onmaster
, Git traditionally generates only a message of the formmerge branch X
. -
A new, empty repository created by
git init
has no commits and therefore has no branches (because a branch can only exist by having commits on it). However, you must be on some branch in this new empty repository. So Git stores some name in the symbolic ref namedHEAD
. This is the branch name that you’re on, even if that branch name does not exist (yet). For a long time, Git has had, hard-coded into it, some code to stick the branch namemaster
in there. (This is, in effect, what GitHub changed.) -
There are a bunch of other string literals reading
master
in the source and documentation as well; they’re being converted to use the configuration settings but this will all take time.
2If you have Git 2.28 or later, run git init --initial-branch=name
, and/or set init.defaultBranch
with git config
in your system or global configuration. If you have an earlier version of Git installed, or have already run git init
, simply use git branch -m
to rename master
to whatever name you like.
error: src refspec main does not match any
This error message from Git is quite cryptic to newbies, but is actually pretty simple. The problems are that it’s loaded with jargon (webster; wikipedia), and abbreviates «source» to «src».
Git is all about commits. When we clone a repository, we have our Git reach out to some other Git. That other Git looks up a repository, and that other repository is full of commits. We then have our Git create a new repository locally, transfer into it all of their commits, and turn all of their branch names into remote-tracking names. Then our Git creates, in this new repository, one branch name, based on one of their branch names. At least, that’s the normal process. (And, if you know what all these terms mean, good! If not, don’t worry too much about them right now. The point to remember here is that we get all their commits and none of their branches, and then we normally have our Git create one branch to match one of theirs.)
Since Git is all about commits, this process—of copying all their commits, but only copying one of their branch names to a name spelled the same in our own repository—is all we need. The fact that our Git renames all of their branch names—so that with the one exception, we don’t have any branches at all—isn’t normally very important. Our own Git deals with this later, automatically, if and when it’s necessary.
When we use git push
, we are asking our Git program, which is reading our own Git repository, to connect to some other Git program—typically running on a server machine—that can then write to some other Git repository. We’d like our Git to send their Git some of our commits. In particular, we want to send them our new commits: the ones we just made. Those are, after all, where we put all our good new stuff. (Git is all about commits, so that’s the only place we can put anything.)
Once we’ve sent these commits, though, we need to their Git to set one of their branch names to remember our new commits. That’s because the way Git finds commits is to use branch names.3 The real names of each commit are big ugly hash ID numbers, which nobody wants to remember or look at; so we have Git remember these numbers using the branch names. That way, we only have to look at the branch names, and these names can be meaningful to us: trunk
, or feature/tall
, or tuatahi
, or whatever.
By default and convention, the way we do this using git push
is pretty simple:
git push origin main
for instance. The git push
part is the command that means send commits and ask them to set a name. The origin
part is what Git calls a remote: a short name that, mostly, holds a URL. The main
part at the end, here, is our branch name. That’s the one our Git is using to find our commits. We’ll have our Git send our commits, then ask their Git to set their main
too.
This last part—where we’ve put in main
here—is what Git calls a refspec. Refspecs actually let us put in two names, separated by a colon, or a couple of other forms. We can, for instance, use HEAD:main
as in Arka’s answer (although for technical reasons we might want to use HEAD:refs/heads/main
in many cases). But in simple cases, we can just use one branch name: git push origin main
. The simple branch name is a simple form of refspec.
For this to work, the source name must be the name of an existing branch in our own Git repository. This is where things are going wrong.
(See also Message ‘src refspec master does not match any’ when pushing commits in Git)
3Git can use any name, not just a branch name. For instance, a tag name works fine. But this answer is about branch names because the question is about branch names, and branch names are the most common ones to use here.
What if our Git created only master
?
Suppose we’re using GitHub and we’ve asked GitHub to make a new repository for us. They run a form of git init
that supplies, as the new repository’s initial branch name, the name main
. They may or may not create one commit, too. Let’s say we do have them create this one commit. That one commit will hold README
and/or LICENSE
files, based on what we choose using the web interface. Creating that initial commit actually creates the branch name main
.
If we now clone their repository, we’ll get their one commit, which will be under their branch name main
. Our Git will rename their main
to origin/main
and then create one new branch name, main
, to match theirs. So all will be good.
But, if we create our own empty Git repository, using git init
ourselves, our Git may set us up so that our first commit will create the name master
. We won’t have a main
branch: we’ll have a master
branch instead.
Or, if we don’t have GitHub create an initial commit, the GitHub repository will be totally empty. Because it has no commits, it has no branches: a branch name is only allowed to exist if it specifies some commit. So if we clone this empty repository, we’ll have no branches either, and our Git won’t know to use main
: our Git may instead use master
. We’re back in that same situation, where our Git think the first name to create should be master
.
So, in these various situations, we make our first commit(s), and they all go on a branch named master
. If we now run:
git push -u origin main
(with or without the -u
; I won’t go into the details about the -u
here) our Git looks around in our Git repository for a branch named main
. There isn’t one! So our Git just gives us that:
error: src refspec main does not match any
error message.
To fix this, we can either git push origin master
—which sends our commits and then asks GitHub to create a new branch in the GitHub repository, with that branch name being master
—or rename our master
to whatever name we wanted, and then use that name:
git branch -m master xyzzy
git push -u origin xyzzy
will make the (single) branch name that we both use be xyzzy
. If you want main
here, rename your master
to main
.
What if you’ve accidentally made both branches?
Suppose we used GitHub to create a new repository, with their new default branch name main
, that includes one initial commit with the usual README and LICENSE files. Then, without thinking about it, we used git init
on our own machine to create our own new repository, with its default branch name master
, and we made a commit or two on our master
.
If we now rename our master
to main
:
git branch -m master main
and then try to push:
git push -u origin main
we get a different error:
! [rejected] main -> main (non-fast-forward)
The reason for this is simple enough: They have a commit, that they find using their name main
, that we do not have. If they change their name main
to find the last commit that we’re sending them, they’ll lose the initial commit they made, with the README and LICENSE files.
You have a bunch of options here:
-
You can ignore the initial commit they made. It’s just a boilerplate commit, after all. You can tell them to throw it away entirely. Use
git push --force
as outlined in any of many existing StackOverflow answers. -
You can obtain their initial commit and rebase your commits on those commits. This can be slightly tricky, because your first commit is a root commit. If your first commit contains README and/or LICENSE files, you’ll get an add/add conflict here. In this case it’s probably simpler to just force-push.
-
You can obtain their initial commit and merge your commits. In a modern Git, this requires using the
--allow-unrelated-histories
option. As with the rebase method, if your commits contain README and/or LICENSE files, you’ll get add/add conflicts. The resulting repository will also have two root commits. None of these are serious problems, but they might prove slightly annoying.
To obtain their commit, simply run git fetch origin
. That will get GitHub’s first commit, and use the name origin/main
in your own Git repository to remember it. You can then:
git rebase origin/main
or:
git merge --allow-unrelated-histories origin/main
to achieve the rebase or merge. You can choose whether to rename your branch to main
, if you have not already done so, at any time before or after doing all of this.
When you first try and push to a git
repository, you may get the following error message:
error: src refspec master does not match any.
error: failed to push some refs to '[email protected] ... .git'
This is because you have not committed your files!
git commit -m "initial commit"
git push origin main
The above code will commit your files that are staged, before pushing them to your desired branch.
By default, we push our code to the main
branch above. Swap this out with another branch if you need.
How to Show all References in Git
If you want to first see the references in git, then you can use the show-ref
command:
git show-ref
# abc123d5d8d40586df855302eca139ee2b75f789 refs/heads/main
# abc123d5d8d40586df855302eca139ee2b75f789 refs/remotes/origin/main
Once you know this, you can push the code accordingly:
git push origin HEAD:<branch>
You may also ask these questions
How do I fix error SRC Refspec master does not match any?
First check what git references:
git show-ref
How do I fix error SRC Refspec main does not match any error failed to push some refs to?
git commit -m "<your message>"
git push origin main
How do I push to main branch GitHub?
git push -u origin main
How do I force git to push?
git push -u origin <branch> -f
Я создал новый проект с одним файлом README.md.
И сделал команду
git clone https://github.com/xxxx/xxx.git
git add .
git commit -m "v.01"
git push origin master
Но получаю ошибку
error: src refspec master does not match any
error: failed to push some refs to https://github.com/xxxx/xxx.git
Я вводил
git show-ref
3deeeb53dda70bea0809cff5e4032011ba45ac7d refs/heads/main
27383695f3f76e87254687449d73250254560bbb refs/remotes/origin/HEAD
27383695f3f76e87254687449d73250254560bbb refs/remotes/origin/main
3deeeb53dda70bea0809cff5e4032011ba45ac7d refs/remotes/origin/master
И делал так
Maybe you just need to commit. I ran into this when I did:
mkdir repo && cd repo
git remote add origin /path/to/origin.git
git add .Oops! Never committed!
git push -u origin master
error: src refspec master does not match any.All I had to do was:
git commit -m «initial commit»
git push origin masterSuccess!
Я пытался еще так
git push origin HEAD:master
Но хоть загрузка и произошла но файлы не загрузились в github
Но это не помогло что мне делать как исправить
-
Вопрос заданболее двух лет назад
-
22668 просмотров
Нет ветки master, вот и ругается. Ветка по умолчанию на GitHub теперь называется main.
Команда git branch -vv покажет какие ветки есть локально и с какими внешними ветками связаны.
* main 0e02250 [origin/main] v.01
Надо было делать git push origin main
Либо просто git push т. е. отправить текущую ветку в связанную с ней ветку на внешнем репозитории.
В нашем случае текущая ветка main (помеченная звёздочкой)
отслеживает исходную ветку main в репозитории обозначенном как origin
Что скрывается за сокращением origin покажет команда git remote -v
origin https://github.com/xxx/xxx.git (fetch)
origin https://github.com/xxx/xxx.git (push)
Пригласить эксперта
Ввожу git branch -vv — никакого ответа
git push -u origin main не работает хотя связь с удаленным репозиторием установлена
работает так
Для отправки в удаленный репозиторий
git push origin master:master
-
Показать ещё
Загружается…
26 мая 2023, в 01:06
500 руб./за проект
26 мая 2023, в 00:08
2500 руб./за проект
25 мая 2023, в 22:01
2000 руб./за проект
Минуточку внимания
Created a private repository on GitHub and when tried to push the files from my server using the below commands, I get error: src refspec main does not match any.
The complete command and error are as below:
# git add . # git commit -m "Initial Commit" # git push origin main
I also used the token as per the latest git policy but didn’t work and got the below error message:
error: src refspec main does not match any. error: failed to push some refs to 'https://ghp_....ROGL....RxUje@github.com/XXXX/XXX.git'
How to solve git error: src refspec main does not match any
Starting from October 1st, GitHub renamed master branch to main and all new repositories will create the default branch named main
. Well, if you are curious to know why this change, then here’s an article explaining the reason.
Lets check the local reference head using the below command.
$ git show-ref 95b095fb6dd8c8af48c35317af7da14bd9f9f622 refs/heads/master
The output of the above command says that the local is still refering to master
head and not the newly renamed main
.
To change the local reference to point to main
branch, replace HEAD:master
with HEAD:main
in the below command.
# git push origin HEAD:master
to
# git push origin HEAD:main
The above command states that you want to push the local ref HEAD
to the remote ref main
.
That’s it!
Ramya Santhosh
is a Web Designer and content creator. A freelance writer on latest trends in technology, gadget reviews, How to’s and many more.
Did you try to push changes to master with the following?
$ git push origin master
But received an error that says:
error: src refspec master does not match any
The most common reason for this is that “master” isn’t called “master” anymore. To fix the issue, replace “master” with “main“.
$ git push origin main
Didn’t help?
This is a comprehensive guide to fixing the “error: src refspec master does not match any” -error. You will find easy fixes with explanations as to what’s going wrong.
Reasons for the “src refspec does not match any” -Error
Let’s have a closer look at the problems that might be causing the src refspec error.
1. The “master” Branch Isn’t Called “master”
Recently, Git replaced the name “master” with “main”. This means the default branch of your project is no longer called “master” by default but “main” instead.
Pushing changes to the non-existent “master” branch will cause issues. This is one of the most common explanations as to why you might see “error: src refspec master does not match any” when pushing.
In this case, you can try pushing to “main” instead.
$ git push origin main
If this doesn’t fix the issue, your default branch might have a different name than “main” or “master“.
To figure out what the “master” or “main” is called in your case, run the following:
$ git show-ref
The default branch is one of these references. Pick the one that’s your default branch and push the changes to it.
2. You Forgot to Commit
Another common reason why you might get the “error: src refspec master does not match any” error when pushing in Git is you haven’t made a commit.
For example, let’s start by creating an example repository and try to push it to GitHub:
$ mkdir example $ cd example $ echo "# Just another github repo" >> README.md $ git init $ git add README.md $ git remote add origin https://github.com/user/repo.git $ git push -u origin main
When running these commands, you will see an error:
error: src refspec main does not match any
This happens because you didn’t commit anything to the repository yet. In technical terms, a branch doesn’t exist before there’s at least one commit in the repository.
So make sure you’ve committed the changes before trying to push!
For instance, in the above, we forgot to commit the new README.md file after adding it. To fix this, create a commit and push again:
$ git commit -m "Initial commit"
Summary
The most common reason for the “error: src refspec master does not match any” -error is that you’re trying to push to “master” which these days is called “main“. In other words, you’re trying to push to a branch that doesn’t exist.
Another reason this error might occur is that your branch is empty and doesn’t exist. This can happen if you’ve initialized your repo, and added changes with git add but forgot to commit the changes with git commit. Before the initial commit, the branch doesn’t technically exist, and pushing will fail!
Thanks for reading. Happy coding!
About the Author
-
I’m an entrepreneur and a blogger from Finland. My goal is to make coding and tech easier for you with comprehensive guides and reviews.
Recent Posts