NAME
git-branch - List, create, or delete branchesSYNOPSIS
git branch [--color[=<when>] | --no-color] [--show-current] [-v [--abbrev=<n> | --no-abbrev]] [--column[=<options>] | --no-column] [--sort=<key>] [--merged [<commit>]] [--no-merged [<commit>]] [--contains [<commit>]] [--no-contains [<commit>]] [--points-at <object>] [--format=<format>] [(-r | --remotes) | (-a | --all)] [--list] [<pattern>...] git branch [--track[=(direct|inherit)] | --no-track] [-f] [--recurse-submodules] <branchname> [<start-point>] git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>] git branch --unset-upstream [<branchname>] git branch (-m | -M) [<oldbranch>] <newbranch> git branch (-c | -C) [<oldbranch>] <newbranch> git branch (-d | -D) [-r] <branchname>... git branch --edit-description [<branchname>]
DESCRIPTION
If --list is given, or if there are no non-option arguments, existing branches are listed; the current branch will be highlighted in green and marked with an asterisk. Any branches checked out in linked worktrees will be highlighted in cyan and marked with a plus sign. Option -r causes the remote-tracking branches to be listed, and option -a shows both local and remote branches.OPTIONS
-d, --deleteDelete a branch. The branch must be fully
merged in its upstream branch, or in HEAD if no upstream was set with
--track or --set-upstream-to.
-D
Shortcut for --delete --force.
--create-reflog
Create the branch’s reflog. This
activates recording of all changes made to the branch ref, enabling use of
date based sha1 expressions such as
"<branchname>@{yesterday}". Note that in non-bare
repositories, reflogs are usually enabled by default by the
core.logAllRefUpdates config option. The negated form
--no-create-reflog only overrides an earlier --create-reflog,
but currently does not negate the setting of
core.logAllRefUpdates.
-f, --force
Reset <branchname> to
<startpoint>, even if <branchname> exists already. Without
-f, git branch refuses to change an existing branch. In
combination with -d (or --delete), allow deleting the branch
irrespective of its merged status, or whether it even points to a valid
commit. In combination with -m (or --move), allow renaming the
branch even if the new branch name already exists, the same applies for
-c (or --copy).
-m, --move
Move/rename a branch, together with its config
and reflog.
-M
Shortcut for --move --force.
-c, --copy
Copy a branch, together with its config and
reflog.
-C
Shortcut for --copy --force.
--color[=<when>]
Color branches to highlight current, local,
and remote-tracking branches. The value must be always (the default), never,
or auto.
--no-color
Turn off branch colors, even when the
configuration file gives the default to color output. Same as
--color=never.
-i, --ignore-case
Sorting and filtering branches are case
insensitive.
--column[=<options>], --no-column
Display branch listing in columns. See
configuration variable column.branch for option syntax. --column
and --no-column without options are equivalent to always and
never respectively.
This option is only applicable in non-verbose mode.
-r, --remotes
List or delete (if used with -d) the
remote-tracking branches. Combine with --list to match the optional
pattern(s).
-a, --all
List both remote-tracking branches and local
branches. Combine with --list to match optional pattern(s).
-l, --list
List branches. With optional
<pattern>..., e.g. git branch --list 'maint-*', list only
the branches that match the pattern(s).
--show-current
Print the name of the current branch. In
detached HEAD state, nothing is printed.
-v, -vv, --verbose
When in list mode, show sha1 and commit
subject line for each head, along with relationship to upstream branch (if
any). If given twice, print the path of the linked worktree (if any) and the
name of the upstream branch, as well (see also git remote show
<remote>). Note that the current worktree’s HEAD will not
have its path printed (it will always be your current directory).
-q, --quiet
Be more quiet when creating or deleting a
branch, suppressing non-error messages.
--abbrev=<n>
In the verbose listing that show the commit
object name, show the shortest prefix that is at least <n>
hexdigits long that uniquely refers the object. The default value is 7 and can
be overridden by the core.abbrev config option.
--no-abbrev
Display the full sha1s in the output listing
rather than abbreviating them.
-t, --track[=(direct|inherit)]
When creating a new branch, set up
branch.<name>.remote and branch.<name>.merge
configuration entries to set "upstream" tracking configuration for
the new branch. This configuration will tell git to show the relationship
between the two branches in git status and git branch -v.
Furthermore, it directs git pull without arguments to pull from the
upstream when the new branch is checked out.
The exact upstream branch is chosen depending on the optional argument:
-t, --track, or --track=direct means to use the
start-point branch itself as the upstream; --track=inherit means to
copy the upstream configuration of the start-point branch.
The branch.autoSetupMerge configuration variable specifies how git
switch, git checkout and git branch should behave when
neither --track nor --no-track are specified:
The default option, true, behaves as though --track=direct were
given whenever the start-point is a remote-tracking branch. false
behaves as if --no-track were given. always behaves as though
--track=direct were given. inherit behaves as though
--track=inherit were given. simple behaves as though
--track=direct were given only when the start-point is a
remote-tracking branch and the new branch has the same name as the remote
branch.
See git-pull(1) and git-config(1) for additional discussion on how
the branch.<name>.remote and branch.<name>.merge
options are used.
--no-track
Do not set up "upstream"
configuration, even if the branch.autoSetupMerge configuration variable is
set.
--recurse-submodules
THIS OPTION IS EXPERIMENTAL! Causes the
current command to recurse into submodules if
submodule.propagateBranches is enabled. See
submodule.propagateBranches in git-config(1). Currently, only
branch creation is supported.
When used in branch creation, a new branch <branchname> will be created in
the superproject and all of the submodules in the superproject’s
<start-point>. In submodules, the branch will point to the submodule
commit in the superproject’s <start-point> but the
branch’s tracking information will be set up based on the
submodule’s branches and remotes e.g. git branch
--recurse-submodules topic origin/main will create the submodule branch
"topic" that points to the submodule commit in the
superproject’s "origin/main", but tracks the
submodule’s "origin/main".
--set-upstream
As this option had confusing syntax, it is no
longer supported. Please use --track or --set-upstream-to
instead.
-u <upstream>, --set-upstream-to=<upstream>
Set up <branchname>'s tracking
information so <upstream> is considered <branchname>'s upstream
branch. If no <branchname> is specified, then it defaults to the current
branch.
--unset-upstream
Remove the upstream information for
<branchname>. If no branch is specified it defaults to the current
branch.
--edit-description
Open an editor and edit the text to explain
what the branch is for, to be used by various other commands (e.g.
format-patch, request-pull, and merge (if enabled)).
Multi-line explanations may be used.
--contains [<commit>]
Only list branches which contain the specified
commit (HEAD if not specified). Implies --list.
--no-contains [<commit>]
Only list branches which don’t contain
the specified commit (HEAD if not specified). Implies --list.
--merged [<commit>]
Only list branches whose tips are reachable
from the specified commit (HEAD if not specified). Implies
--list.
--no-merged [<commit>]
Only list branches whose tips are not
reachable from the specified commit (HEAD if not specified). Implies
--list.
<branchname>
The name of the branch to create or delete.
The new branch name must pass all checks defined by
git-check-ref-format(1). Some of these checks may restrict the
characters allowed in a branch name.
<start-point>
The new branch head will point to this commit.
It may be given as a branch name, a commit-id, or a tag. If this option is
omitted, the current HEAD will be used instead.
<oldbranch>
The name of an existing branch to
rename.
<newbranch>
The new name for an existing branch. The same
restrictions as for <branchname> apply.
--sort=<key>
Sort based on the key given. Prefix -
to sort in descending order of the value. You may use the --sort=<key>
option multiple times, in which case the last key becomes the primary key. The
keys supported are the same as those in git for-each-ref. Sort order
defaults to the value configured for the branch.sort variable if
exists, or to sorting based on the full refname (including refs/...
prefix). This lists detached HEAD (if present) first, then local branches and
finally remote-tracking branches. See git-config(1).
--points-at <object>
Only list branches of the given object.
--format <format>
A string that interpolates %(fieldname)
from a branch ref being shown and the object it points at. The format is the
same as that of git-for-each-ref(1).
CONFIGURATION
pager.branch is only respected when listing branches, i.e., when --list is used or implied. The default is to use a pager. See git-config(1).Tells git branch, git switch and
git checkout to set up new branches so that git-pull(1) will
appropriately merge from the starting point branch. Note that even if this
option is not set, this behavior can be chosen per-branch using the
--track and --no-track options. The valid settings are:
false — no automatic setup is done; true —
automatic setup is done when the starting point is a remote-tracking branch;
always — automatic setup is done when the starting point is
either a local branch or remote-tracking branch; inherit — if
the starting point has a tracking configuration, it is copied to the new
branch; simple — automatic setup is done only when the starting
point is a remote-tracking branch and the new branch has the same name as the
remote branch. This option defaults to true.
branch.autoSetupRebase
When a new branch is created with git
branch, git switch or git checkout that tracks another
branch, this variable tells Git to set up pull to rebase instead of merge (see
"branch.<name>.rebase"). When never, rebase is never
automatically set to true. When local, rebase is set to true for
tracked branches of other local branches. When remote, rebase is set to
true for tracked branches of remote-tracking branches. When always,
rebase will be set to true for all tracking branches. See
"branch.autoSetupMerge" for details on how to set up a branch to
track another branch. This option defaults to never.
branch.sort
This variable controls the sort ordering of
branches when displayed by . Without the
"--sort=<value>" option provided, the value of this variable
will be used as the default. See git-for-each-ref(1) field names for
valid values.
branch.<name>.remote
When on branch <name>, it tells git
fetch and git push which remote to fetch from/push to. The remote
to push to may be overridden with remote.pushDefault (for all
branches). The remote to push to, for the current branch, may be further
overridden by branch.<name>.pushRemote. If no remote is
configured, or if you are not on any branch and there is more than one remote
defined in the repository, it defaults to origin for fetching and
remote.pushDefault for pushing. Additionally, . (a period) is
the current local repository (a dot-repository), see
branch.<name>.merge's final note below.
branch.<name>.pushRemote
When on branch <name>, it overrides
branch.<name>.remote for pushing. It also overrides
remote.pushDefault for pushing from branch <name>. When you pull
from one place (e.g. your upstream) and push to another place (e.g. your own
publishing repository), you would want to set remote.pushDefault to
specify the remote to push to for all branches, and use this option to
override it for a specific branch.
branch.<name>.merge
Defines, together with
branch.<name>.remote, the upstream branch for the given branch. It tells
git fetch/git pull/git rebase which branch to merge and
can also affect git push (see push.default). When in branch
<name>, it tells git fetch the default refspec to be marked for
merging in FETCH_HEAD. The value is handled like the remote part of a refspec,
and must match a ref which is fetched from the remote given by
"branch.<name>.remote". The merge information is used by
git pull (which at first calls git fetch) to lookup the default
branch for merging. Without this option, git pull defaults to merge the
first refspec fetched. Specify multiple values to get an octopus merge. If you
wish to setup git pull so that it merges into <name> from another
branch in the local repository, you can point branch.<name>.merge to the
desired branch, and use the relative path setting . (a period) for
branch.<name>.remote.
branch.<name>.mergeOptions
Sets default options for merging into branch
<name>. The syntax and supported options are the same as those of
git-merge(1), but option values containing whitespace characters are
currently not supported.
branch.<name>.rebase
When true, rebase the branch <name> on
top of the fetched branch, instead of merging the default branch from the
default remote when "git pull" is run. See "pull.rebase"
for doing this in a non branch-specific manner.
When merges (or just m), pass the --rebase-merges option to
git rebase so that the local merge commits are included in the rebase
(see git-rebase(1) for details).
When the value is interactive (or just i), the rebase is run in
interactive mode.
NOTE: this is a possibly dangerous operation; do not use it unless
you understand the implications (see git-rebase(1) for details).
branch.<name>.description
Branch description, can be edited with git
branch --edit-description. Branch description is automatically added in
the format-patch cover letter or request-pull summary.
EXAMPLES
Start development from a known tag$ git clone git://git.kernel.org/pub/scm/.../linux-2.6 my2.6 $ cd my2.6 $ git branch my2.6.14 v2.6.14 (1) $ git switch my2.6.14
$ git clone git://git.kernel.org/.../git.git my.git $ cd my.git $ git branch -d -r origin/todo origin/html origin/man (1) $ git branch -D test (2)
$ git branch -r -l '<remote>/<pattern>' (1) $ git for-each-ref 'refs/remotes/<remote>/<pattern>' (2)
NOTES
If you are creating a branch that you want to switch to immediately, it is easier to use the "git switch" command with its -c option to do the same thing with a single command.•--contains <commit> is
used to find all branches which will need special attention if <commit>
were to be rebased or amended, since those branches contain the specified
<commit>.
•--no-contains <commit> is
the inverse of that, i.e. branches that don’t contain the specified
<commit>.
•--merged is used to find all
branches which can be safely deleted, since those branches are fully contained
by HEAD.
•--no-merged is used to find
branches which are candidates for merging into HEAD, since those branches are
not fully contained by HEAD.
SEE ALSO
git-check-ref-format(1), git-fetch(1), git-remote(1), “Understanding history: What is a branch?”[1] in the Git User’s Manual.GIT
Part of the git(1) suiteNOTES
- 1.
- “Understanding history: What is a branch?”
file:///usr/share/doc/git/html/user-manual.html#what-is-a-branch
02/28/2023 | Git 2.39.2 |