118
votes

I cloned a repo using the

git clone -b <branch name> --single-branch <github url> <target directory>

This cloned ONLY this branch, but now I want to switch to the master and other branches. Is there any way besides clearing it out and starting over to clone the rest of the repo that I can undo the --single-branch preference?

7

7 Answers

180
votes

You can tell Git to pull all branches like this:

git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
git fetch origin

If you look in .git/config, it'll look something like this:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = false
[remote "origin"]
    url = https://github.com/owner/repo.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true

I compared this to a full clone, and saw that the only difference was the "fetch" under [remote "origin"].

Note: I'm running Git version 1.8.2. The config options may have changed if you're running an older version of Git. If my commands don't work, then I'd recommend looking through .git/config to see if you can see something similar.

69
votes

If you want to add a single branch, you can do the following:

git remote set-branches --add origin [remote-branch]
git fetch origin [remote-branch]:[local-branch]

Works with git version 1.9.1

10
votes

To add another remote branch to my local repository that was cloned using --single-branch, the following works for me:

git remote set-branches --add origin [remote-branch]
git fetch
git checkout [remote-branch]

You can also use wildcards for [remote-branch], e.g.

git remote set-branches --add origin release-1.*
git fetch
git checkout release-1.5

This works using git version 2.21.1. Other answers suggesting to do git fetch origin [remote-branch]:[local-branch] did not work as it creates the local branch in an untracked state. When running git pull it first tried to merge all the commits of the remote branch to my local one once again.

1
votes

Just add the original repo as a new remote, and work off of there?

git remote add path/to/myrepo myNewOrigin
git fetch myNewOrigin

You can even delete your current 'origin' remote and rename 'myNewOrigin' to 'origin' if you would want to.

From there you can pull/merge/rebase.

1
votes

For me worked:

git remote remove origin
git remote add origin https://*<yourPath>*.git
git fetch
0
votes

Just change .git/config file of your local repo, line fetch of [remote origin] section.

Before something like this

[remote "origin"]
    url = https://github.com/owner/repo.git
    fetch = +refs/heads/master:refs/remotes/origin/master

After it will be so

[remote "origin"]
    url = https://github.com/owner/repo.git
    fetch = +refs/heads/*:refs/remotes/origin/*
0
votes

I initially applied Dominik Pawlak's answer and it worked. But I wasn't able to pull any further changes, after I committed more code into my new branch.

There is another way of resetting single-branch entirely, which hasn't been mentioned here:

git remote remove origin
git remote add origin [email protected]:{yourProject}/{yourRepo}.git
git branch --set-upstream-to=origin/{yourBranch}  {yourBranch}
git pull

This resets everything to the original.