Posted By: Anonymous
Which one of these lines is correct?
git checkout 'another_branch'
git checkout origin 'another_branch'
git checkout origin/'another_branch'
And what is the difference between them?
another_branch already exists locally and you are not on this branch, then
git checkout another_branch switches to the branch.
another_branch does not exist but
origin/another_branch does, then
git checkout another_branch is equivalent to
git checkout -b another_branch origin/another_branch; git branch -u origin/another_branch. That’s to create
origin/another_branch and set
origin/another_branch as the upstream of
If neither exists,
git checkout another_branch returns error.
git checkout origin another_branch returns error in most cases. If
origin is a revision and
another_branch is a file, then it checks out the file of that revision but most probably that’s not what you expect.
origin is mostly used in
git pull and
git push as a remote, an alias of the url to the remote repository.
git checkout origin/another_branch succeeds if
origin/another_branch exists. It leads to be in detached HEAD state, not on any branch. If you make new commits, the new commits are not reachable from any existing branches and none of the branches will be updated.
As 2.23.0 has been released, with it we can also use
git switch to create and switch branches.
foo exists, try to switch to
git switch foo
foo does not exist and
origin/foo exists, try to create
origin/foo and then switch to
git switch -c foo origin/foo # or simply git switch foo
More generally, if
foo does not exist, try to create
foo from a known ref or commit and then switch to
git switch -c foo <ref> git switch -c foo <commit>
If we maintain a repository in Gitlab and Github at the same time, the local repository may have two remotes, for example,
origin for Gitlab and
github for Github. In this case the repository has
git switch foo will complain
fatal: invalid reference: foo, because it does not known from which ref,
github/foo, to create
foo. We need to specify it with
git switch -c foo origin/foo or
git switch -c foo github/foo according to the need. If we want to create branches from both remote branches, it’s better to use distinguishing names for the new branches:
git switch -c gitlab_foo origin/foo git switch -c github_foo github/foo
foo exists, try to recreate/force-create
foo from (or reset
foo to) a known ref or commit and then switch to
git switch -C foo <ref> git switch -C foo <commit>
which are equivalent to:
git switch foo git reset [<ref>|<commit>] --hard
Try to switch to a detached HEAD of a known ref or commit:
git switch -d <ref> git switch -d <commit>
If you just want to create a branch but not switch to it, use
git branch instead. Try to create a branch from a known ref or commit:
git branch foo <ref> git branch foo <commit>