Why is it not a commit and a branch cannot be created from it?

GitGit Non-Bare-Repository

Git Problem Overview


I need to work with an intricate configuration of repositories. I have 5 of them:

  1. A remote central repository on machine 1.
  2. My local repository on my notebook (machine 2).
  3. A bare repository on machine 3.
  4. A repository on machine 3.
  5. A repository on machine 4 where we do code review.

So, my understanding that it works this way:

  1. On my laptop (machine 2) I clone / pull from the central repository located on machine 1.
  2. I push the local repo to the machine 3 (using the bare repository as a "intermediate").

Now I did some changes on the machine 3 and I want to push these changes to machine 4. Here are the instructions that I need to follow:

  1. On machine 3 do all work in your test-branch, commit.
  2. Push to your bare repo on machine 3: git push origin test-branch
  3. On your laptop: fetch new commits from the machine-3 repo: git fetch machine3
  4. Check out your branch from machine 3: git checkout -b test-branch machine-3/test-branch
  5. Fetch commits from machine-4: git fetch origin
  6. git rebase origin/master
  7. git push origin HEAD:refs/for/master

I have problems with step 4. I get the following error:

fatal: 'machine3/test-branch' is not a commit and a branch 'test-branch' cannot be created from it

ADDED

When I execute

git rev-parse machine3/test-branch

On my laptop (machine 2) I get:

machine3/test-branch
fatal: ambiguous argument 'machine3/test-branch': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

Git Solutions


Solution 1 - Git

For those who found this searching for an answer to fatal: 'origin/remote-branch-name' is not a commit and a branch 'local-branch-name' cannot be created from it, you may also want to try this first:

git fetch --all

If you run git checkout -b local-branch-name origin/remote-branch-name without fetching first, you can run into that error.

The reason it says "is not a commit" rather than something clearer like "branch doesn't exist" is because git takes the argument where you specified origin/remote-branch-name and tries to resolve it to a commit hash. You can use tag names and commit hashes as an argument here, too. If they fail, it generates the same error. If git can't resolve the branch you provide to a specific commit, it's usually because it doesn't have the freshest list of remote branches. git fetch --all fixes that scenario.

The --all flag is included in case you have multiple remotes (e.g. origin, buildserver, joespc, etc.), because git fetch by itself defaults to your first remote-- usually origin. You can also run fetch against a specific remote; e.g., git fetch buildserver will only fetch all the branches from the buildserver remote.

To list all your remotes, run the command git remote -v. You can omit the --all flag from git fetch if you only see one remote name (e.g. origin) in the results.

Solution 2 - Git

We had this error:

fatal: 'origin/newbranch' is not a commit and a branch 'newbranch' cannot be created from it

because we did a minimalistic clone using:

git  clone  --depth 1  --branch 'oldbranch'  --single-branch  'git@github.com:user/repo.git'

For us the minimalistic fix was:

git  remote  set-branches  --add  'origin'  'newbranch'
git  fetch  'origin'
git  checkout  --track  'origin/newbranch'

Assuming the remote is called 'origin' and the remote branch is called 'newbranch'.

Solution 3 - Git

I managed to fix this with this settings, just update the config with this command

git config -e --global

and add this config.

[remote "origin"]
    url = https://git.example.com/example.git (you can omit this URL)
    fetch = +refs/heads/*:refs/remotes/origin/*

and then you can git fetch --all

Solution 4 - Git

If you're checking out a branch from a tag (like git checkout -b XXXX v0.1.1) , you can try git fetch --tags first.

Solution 5 - Git

I found this question troubleshooting simpler problem: I recieved same error trying to create a lobal branch from remote. I resolved it by creating branch from commit hash:

git ls-remote origin remote-branch
returned
<hash>  refs/heads/remote-branch

git checkout -b local-branch <hash>

Solution 6 - Git

For this issue:

fatal: 'machine3/test-branch' is not a commit and a branch 'test-branch' cannot be created from it

For me, I should have checked out to test-branch first, then it worked fine and created a new branch from test-branch.

Solution 7 - Git

We were having this exact error in a Windows machine running gitbash on a folder synced with google drive.

It was caused by having the feature "Enable experimental built-in file system monitor" enabled.

After uninstalling and reinstalling gitbash with this feature disabled it was fixed.

enter image description here

Solution 8 - Git

The question is complex / convolute, the answer is simple. There was a mismatch between the alias and machine3. The alias for the remote that has been used, was not for machine3. The machine3 had another alias.

Solution 9 - Git

The solution from J.D. Mallen involves git fetch --all

Starting with VSCode 1.53 (Jan. 2021), you will have (issue 110811 and PR 111090):

> Changing autofetch to a string config which has "current", "all" and "off". > > This allows users to fetch from all remotes instead of just their origin.
For developers working on a Fork, this should make extensions work more intuitively.

So if you set the VSCode setting git.autofetch to "all", you won't even have to type git fetch --all.

Solution 10 - Git

I used git workflow in visual studio code as shown in the below diagram to solve mine:

create a feature branch using git on vscode

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRomanView Question on Stackoverflow
Solution 1 - GitJ.D. MallenView Answer on Stackoverflow
Solution 2 - GitJeroen Vermeulen - MageHostView Answer on Stackoverflow
Solution 3 - GitPlayer1View Answer on Stackoverflow
Solution 4 - GitttfreemanView Answer on Stackoverflow
Solution 5 - GitVladimir NikotinView Answer on Stackoverflow
Solution 6 - GitVahid NajafiView Answer on Stackoverflow
Solution 7 - GitLucianoView Answer on Stackoverflow
Solution 8 - GitRomanView Answer on Stackoverflow
Solution 9 - GitVonCView Answer on Stackoverflow
Solution 10 - GitOkpoView Answer on Stackoverflow