How do I clone a specific Git branch? [duplicate]
Asked Answered
L

7

4035

Git clone will clone remote branch into local.

Is there any way to clone a specific branch by myself without switching branches on the remote repository?

Lobo answered 15/12, 2009 at 23:6 Comment(0)
P
2478
git clone --single-branch --branch <branchname> <remote-repo>

The --single-branch option is valid from version 1.7.10 and later.

Please see also the other answer which many people prefer.

You may also want to make sure you understand the difference. And the difference is: by invoking git clone --branch <branchname> url you're fetching all the branches and checking out one. That may, for instance, mean that your repository has a 5kB documentation or wiki branch and 5GB data branch. And whenever you want to edit your frontpage, you may end up cloning 5GB of data.

Again, that is not to say git clone --branch is not the way to accomplish that, it's just that it's not always what you want to accomplish, when you're asking about cloning a specific branch.

Paradise answered 15/12, 2009 at 23:9 Comment(6)
Comments are not for extended discussion; this conversation has been moved to chat.Galway
Pardon me, are you sure about the part you said "you're fetching all..."? I read somewhere that git fetch doesn't actually "copy" any files, it just fetches metadata and information about the changes. So it should be relatively light weight... Maybe you've used the word "fetch" literally and not from the git vocabulary?Unbodied
@aderchox, no it will actually fetch all the content. It is pretty smart about things it transfers when you update, but when you clone a big repository it actually pulls the history, unless you explicitly tell it not to. But it will still fetch the tip of the branch. What git fetch does not — it does not check out files, but that's not about the transfer.Paradise
Often you will also want --depth 1 so that you only get the latest. This can save a lot of downloading time.Annelieseannelise
git clone -b branch_name --single-branch 'repo_url'Orazio
You can also clone with --no-checkout at all, and then set a filter with sparse-checkout with a particular --branch as well to just clone a sub-set of the files in the branch that match your filter, which can even be just a list of file paths that you want (you may want to use --no-cone). This set of features is currently evolving from git v2.24 to v2.34. You may need to check which features you've got in your version.Discounter
M
8929
git clone -b <branch> <remote_repo>

Example:

git clone -b my-branch [email protected]:user/myproject.git

With Git 1.7.10 and later, add --single-branch to prevent fetching of all branches. Example, with OpenCV 2.4 branch:

git clone -b opencv-2.4 --single-branch https://github.com/Itseez/opencv.git
Misteach answered 31/12, 2010 at 5:36 Comment(14)
pierr: I'm not sure if this answers the description of the problem given above, but it does answer the actual question - how to clone a specific branch of a repository. I voted this up because it's the answer I was googling for when I came to this page.Donaldson
This works. It points the new HEAD at the specified branch rather than at the HEAD-branch in myproject. However, it still fetches all branches. See @edmar-miyake's answer.Alain
It answers the description of the problem if you add a --depth X to the command. If you do so, it will clone only the specified branch and its last content.Inadequate
thx for --single-branch; git 2.5 is out at time of writing this. Don't care for older versions.Ssm
I used the above command, which did pull from github - but I pulled it into master, because that's the branch I was on - it did not create the branch I was cloning locally. That's what I was looking for.Jocund
we can also use : git checkout -b <Branch_Name> git pull origin <Branch_Name> , it works with me xD or, simiply git fetch <Branch_Name> git checkout <Branch_Name>Beckner
@jorge Why -b option requires a separate --single-branch flag? Does -b alone clones all branches?Ensheathe
@CᴴᴀZ Hi, the --single-branch IS NOT required. As you can see in the manpages, git clone "...creates remote-tracking branches for each branch in the cloned repository" and "--[no-]single-branch Clone only the history leading to the tip of a single branch, either specified by the --branch option or the primary branch remote’s HEAD points at." You save some time in big repos I guess.Misteach
Thanks, for helping. --single-braches aren't required to work remind that <3Dwight
This is especially helpful for scripting the installation of code that doesn't need to be built, for instance config files. I keep my NGINX configs in a repo and my userdata script clones and moves them into place with rsync. There is no need to cd into the repo if you cloned with HEAD pointing to the right branch.Outwear
@JorgeE.Cardona Was really helped me. I was taking the pull so it is taking from "master" branch which is not reflecting my latest changes of other updated sub-branch.Culottes
@Culottes I'm happy it helped. I am unsure what is your question, the first command should include any children as well, but it sets the HEAD to the designed branch. Unless you are using --single-branches in which case you get only the commits leading to that branch and no other branches. Use git log --graph --oneline --all to see the whole tree.Misteach
Is there a way to include branch in the ssh/https url? eg git clone [email protected]:user/myproject.git/my-branchMitzi
NOTE that --single-branch will cause future git fetch calls to only fetch that branch. You may find yourself later wondering why your tools don't show all the remote branches that you KNOW exist! Even after you fetch.Considerable
P
2478
git clone --single-branch --branch <branchname> <remote-repo>

The --single-branch option is valid from version 1.7.10 and later.

Please see also the other answer which many people prefer.

You may also want to make sure you understand the difference. And the difference is: by invoking git clone --branch <branchname> url you're fetching all the branches and checking out one. That may, for instance, mean that your repository has a 5kB documentation or wiki branch and 5GB data branch. And whenever you want to edit your frontpage, you may end up cloning 5GB of data.

Again, that is not to say git clone --branch is not the way to accomplish that, it's just that it's not always what you want to accomplish, when you're asking about cloning a specific branch.

Paradise answered 15/12, 2009 at 23:9 Comment(6)
Comments are not for extended discussion; this conversation has been moved to chat.Galway
Pardon me, are you sure about the part you said "you're fetching all..."? I read somewhere that git fetch doesn't actually "copy" any files, it just fetches metadata and information about the changes. So it should be relatively light weight... Maybe you've used the word "fetch" literally and not from the git vocabulary?Unbodied
@aderchox, no it will actually fetch all the content. It is pretty smart about things it transfers when you update, but when you clone a big repository it actually pulls the history, unless you explicitly tell it not to. But it will still fetch the tip of the branch. What git fetch does not — it does not check out files, but that's not about the transfer.Paradise
Often you will also want --depth 1 so that you only get the latest. This can save a lot of downloading time.Annelieseannelise
git clone -b branch_name --single-branch 'repo_url'Orazio
You can also clone with --no-checkout at all, and then set a filter with sparse-checkout with a particular --branch as well to just clone a sub-set of the files in the branch that match your filter, which can even be just a list of file paths that you want (you may want to use --no-cone). This set of features is currently evolving from git v2.24 to v2.34. You may need to check which features you've got in your version.Discounter
M
357

Here is a really simple way to do it :)

Clone the repository

git clone <repository_url>

List all branches

git branch -a 

Checkout the branch that you want

git checkout <name_of_branch>
Macklin answered 14/7, 2011 at 9:42 Comment(10)
This switched the working directory to the correct branch, but I'm not able to push any changes I make, because I'm not "currently on a branch".Vernettaverneuil
This was the solution for me, since I had already cloned 'master'. I didn't know I could simply 'checkout' a remote branch.Actinozoan
This is probably the correct way to do it; best-practices-wiseCalceiform
git checkout mybranchname then git fetch doneCastrate
This way doesn't clone only the choosen branch. This answer seems better: https://mcmap.net/q/36094/-how-do-i-clone-a-specific-git-branch-duplicate. For example if a repo has many branches that are big enough that we don't wanna clone each one.Stinkhorn
Very crisp answer. One additional things you have to do is: After this step: "git checkout <name_of_branch>" Do this: git branch --set-upstream-to=origin/<branch> <local_branch> Thanks.Jacobi
Won't this retain old files/folders from the original checkout that are no longer present in new branch?Gown
For me it doesn't work. After clone when I run "git branch -a" it shows me nothing. Just blank space.Concinnate
Not a good solution. By using git clone <repository_url> you're getting ALL branches...! then switch to <name_of_branch>.Noheminoil
If somebody creates new branch on github, how to fetch it ?Hibbitts
A
267

To clone a branch without fetching other branches:

mkdir $BRANCH
cd $BRANCH
git init
git remote add -t $BRANCH -f origin $REMOTE_REPO
git checkout $BRANCH
Airedale answered 8/9, 2011 at 14:34 Comment(5)
Good solution. On older git (I have 1.5.5.6), a git branch --track $BRANCH origin/$BRANCH may be needed before the checkout.Ova
Works, and also fetches just those tags present on the branch, which is what I wanted. (I actually wanted to fetch multiple branches, but only selected ones; for that, it sufficed to repeatedly remote add and checkout as here, then git remote rm origin to clean up.)Fussbudget
Perfect solution for shallowly incorporating a specific tag of a git repo in another project. Recommend omitting -f from the git remote command, then using git fetch --depth=1 $BRANCH $TAG, then git checkout FETCH_HEAD. The init is innocuous, and changing tags will automatically update the checked out code.Vinaigrette
Unlike Michael Krelin's (3-step) answer, this one actually worked for me (git 1.7.9.5)Pitarys
after alot of fail, this code is works to me.. git version 2.9.2Califate
A
144

Use:

git checkout -b <branch-name> <origin/branch_name>

For example in my case:

 git branch -a
* master
  origin/HEAD
  origin/enum-account-number
  origin/master
  origin/rel_table_play
  origin/sugarfield_customer_number_show_c

So to create a new branch based on my enum-account-number branch, I do:

git checkout -b enum-account-number origin/enum-account-number

After you hit Return, the following happens:

Branch enum-account-number set up to track remote branch refs/remotes/origin/enum-account-number.
Switched to a new branch "enum-account-number"
Abnaki answered 15/11, 2011 at 19:34 Comment(3)
Note that it may be useful to git pull origin first so that git branch -a can list all new (current) remote branches.Cupcake
Good point. Probably git fetch is better so that the auto merge doesn't happen, though.Abnaki
this solution is helpful for creating a new local branch, switching to it and setting up to track the corresponding remote branchAntipode
S
40

Create a branch on the local system with that name. e.g. say you want to get the branch named branch-05142011

git branch branch-05142011 origin/branch-05142011

It'll give you a message:

$ git checkout --track origin/branch-05142011
Branch branch-05142011 set up to track remote branch refs/remotes/origin/branch-05142011.
Switched to a new branch "branch-05142011"

Now just checkout the branch like below and you have the code

git checkout branch-05142011
Saint answered 15/5, 2011 at 19:20 Comment(6)
This will do too : git fetch origin [remote-branch]:[new-local-branch]Saint
has it right. Miyake (below) shows how to do it when the remote is added.Alain
That should say, "PlanetUnknown has it right."Alain
@Saint Thanks for git fetch origin [remote-branch]:[new-local-branch], I love that!Stackhouse
git fetch origin [remote-branch]:[new-local-branch] for the winStopoff
I tried git branch ue5-early-access origin/ue5-early-access and it errors: "fatal: Not a valid object name: 'origin/ue5-early-access'.", any tip?Inflight
T
35
git --branch <branchname> <url>

But Bash completion don't get this key: --branch

Thierry answered 7/9, 2011 at 10:16 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.