$ git push v5 v5/hotfix/5.1:hotfix/5.1-quartz
error: The destination you provided is not a full refname (i.e.,
starting with "refs/"). We tried to guess what you meant by:
- Looking for a ref that matches 'hotfix/5.1-quartz' on the remote side.
- Checking if the <src> being pushed ('refs/remotes/v5/hotfix/5.1')
is a ref in "refs/{heads,tags}/". If so we add a corresponding
refs/{heads,tags}/ prefix on the remote side.
Neither worked, so we gave up. You must fully qualify the ref.
hint: The <src> part of the refspec is a commit object.
hint: Did you mean to create a new branch by pushing to
hint: 'refs/remotes/v5/hotfix/5.1:refs/heads/hotfix/5.1-quartz'?
error: failed to push some refs to 'http://clu@172.31.212.149:8080/r/LISA/LISA_5.0.0.0.git'
根据下面的链接,进行调整。明确告知是push branch
$ git push v5 v5/hotfix/5.1:refs/heads/hotfix/5.1-quartz
Total 0 (delta 0), reused 0 (delta 0)
remote: Updating references: 100% (1/1)
To http://172.31.212.149:8080/r/LISA/LISA_5.0.0.0.git
* [new branch] v5/hotfix/5.1 -> hotfix/5.1-quartz
TL;DR
You probably wanted:
$ git push remote 51447424149c671958a2f76ec1fefb135a5c2cea:refs/heads/WIP-51447424149c671958a2f76ec1fefb135a5c2cea
to create a branch named WIP-51447424149c671958a2f76ec1fefb135a5c2cea
. (Be sure you really want to create that name, as it's kind of unweildy. It's valid and there is no problem with it, it's just a heck of a thing to type in.)
Long
What Git is complaining about takes a little bit of explanation:
- A branch name is a special form of reference.
- A reference is a string starting with
refs/
. The familiar two kinds of references are branch names and tags. (More about this in just a moment.) - References can be abbreviated ... sometimes, but not always.
- Sometimes (wherever it makes sense to Git) you can use a raw hash ID instead of a reference.
git push
takes a refspec, which is a pair of references separated by a colon (and optionally the whole thing can be prefixed with a plus sign).
What you're doing with git push
is using the (very long) refspec 51447424149c671958a2f76ec1fefb135a5c2cea:WIP-51447424149c671958a2f76ec1fefb135a5c2cea
. The left side of this refspec is the source reference, and the right side is the destination reference.
The thing on the left side of the colon is clearly1 a hash ID. So this is making use of the special case where you can supply a hash ID instead of an actual reference (as long as that object actually exists in your Git repository).
The thing on the right side of the colon, though, is a name, not a hash ID. This is good since this is one of the places that Git requires a name. But it's also a problem, because the name WIP-something
does not start with refs/
.
Note that Git explicitly complains about that:
The destination ... nor begins with
refs/
Before we get to the rest, let's mention branches and tags again. A branch name like master
is short-hand for the reference refs/heads/master
. A tag name like v1.2
is short-hand for the reference refs/tags/v1.2
. Note that in both cases, these start with refs/
. They go on to name which kind of reference we're using:
- A branch name reference starts with
refs/heads/
. - A tag name reference starts with
refs/tags/
.
In other words, when we say that branches and tags are forms of references, we're saying that given a reference, you can look at what comes right after refs/
and figure out what kind of reference it is: refs/heads/
means "branch" and refs/tags/
means "tag". (If you see refs/remotes/
, that means it's a remote-tracking name; and there are yet more special words that go after refs/
, such as notes/
for git notes
.)
We also said above that references can sometimes be abbreviated. That's the first part of what Git is complaining about here, though:
... neither matches an existing ref on the remote ...
You're allowed to leave out the refs/heads/
part, and have the other Git—the one that your Git is pushing-to—figure out that master
really means refs/heads/master
. But this only works if they already have a refs/heads/master
. If you're trying to create a new branch, you must tell the other Git: I'd like you to create a new branch.
You do this by giving the full name of the reference: refs/heads/WIP-something
, for instance. The fact that it starts with refs/heads/
tells the other Git: I'd like to create a branch name. If you send them refs/tags/WIP-something
, you are telling them to create a new tag name.
Anyway, this is why you're getting the rather long complaint, with its two parts: "neither ... nor". So the solution is to send them the full name.
1What, isn't it obvious? :-) This reminds me of the professors who prove theorems by doing six transformations and then saying "the rest is obvious...".