Skip to content

git-branch

列出、创建或删除分支

概要

bash
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] <branch-name> [<start-point>]
git branch (--set-upstream-to=<upstream>|-u <upstream>) [<branch-name>]
git branch --unset-upstream [<branch-name>]
git branch (-m|-M) [<old-branch>] <new-branch>
git branch (-c|-C) [<old-branch>] <new-branch>
git branch (-d|-D) [-r] <branch-name>...
git branch --edit-description [<branch-name>]

描述

如果给出了 --list,或者没有非选项参数,则列出现有分支;当前分支将以绿色突出显示并标记星号。在链接工作树中检出的任何分支将以青色突出显示并标记加号。选项 -r 使远程跟踪分支被列出,选项 -a 显示本地和远程分支。

如果给出了 <pattern>,它将用作 shell 通配符以将输出限制为匹配的分支。如果给出了多个模式,则显示匹配任何模式的分支。

请注意,当提供 <pattern> 时,你必须使用 --list;否则命令可能被解释为分支创建。

使用 --contains,仅显示包含命名提交的分支(换句话说,其顶端提交是命名提交后代的分支),--no-contains 反转它。使用 --merged,仅列出已合并到命名提交的分支(即其顶端提交可从命名提交访问的分支)。使用 --no-merged 仅列出未合并到命名提交的分支。如果 <commit> 参数缺失,则默认为 HEAD(即当前分支的顶端)。

命令的第二种形式创建名为 <branch-name> 的新分支头,指向当前 HEAD,如果给出则指向 <start-point>。作为特殊情况,对于 <start-point>,如果恰好有一个合并基础,你可以使用 <rev-A>...<rev-B> 作为 <rev-A><rev-B> 的合并基础的快捷方式。你最多可以省略 <rev-A><rev-B> 中的一个,在这种情况下它默认为 HEAD

请注意,这将创建新分支,但不会将工作树切换到它;使用 git switch <new-branch> 切换到新分支。

当本地分支从远程跟踪分支开始时,Git 设置分支(具体是 branch.<name>.remotebranch.<name>.merge 配置条目),以便 git pull 将适当地从远程跟踪分支合并。此行为可以通过全局 branch.autoSetupMerge 配置标志更改。该设置可以使用 --track--no-track 选项覆盖,以后可以使用 git branch --set-upstream-to 更改。

使用 -m-M 选项,<old-branch> 将被重命名为 <new-branch>。如果 <old-branch> 有相应的 reflog,它将被重命名以匹配 <new-branch>,并创建 reflog 条目以记住分支重命名。如果 <new-branch> 存在,必须使用 -M 强制重命名。

-c-C 选项与 -m-M 具有完全相同的语义,只是分支不会被重命名,而是会被复制到新名称,连同其配置和 reflog 一起。

使用 -d-D 选项,<branch-name> 将被删除。你可以指定多个分支进行删除。如果分支当前有 reflog,则 reflog 也将被删除。

-r-d 一起使用以删除远程跟踪分支。请注意,仅在远程存储库中不再存在或 git fetch 被配置为不再获取它们时,删除远程跟踪分支才有意义。另请参阅 git-remote(1)prune 子命令以清理所有过时的远程跟踪分支。

选项

-d, --delete

删除分支。分支必须在其上游分支中完全合并,或者如果未使用 --track--set-upstream-to 设置上游,则在 HEAD 中完全合并。

-D

--delete --force 的快捷方式。

--create-reflog

创建分支的 reflog。这激活对分支引用所做的所有更改的记录,允许使用基于日期的 sha1 表达式,如 <branch-name>@{yesterday}。请注意,在非裸存储库中,reflog 通常默认由 core.logAllRefUpdates 配置选项启用。

-f, --force

<branch-name> 重置为 <start-point>,即使 <branch-name> 已存在。没有 -fgit branch 拒绝更改现有分支。与 -d(或 --delete)结合使用时,无论其合并状态如何,甚至无论它是否指向有效提交,都允许删除分支。与 -m(或 --move)结合使用时,即使新分支名称已存在,也允许重命名分支,-c(或 --copy)同样适用。

-m, --move

移动/重命名分支,连同其配置和 reflog。

-M

--move --force 的快捷方式。

-c, --copy

复制分支,连同其配置和 reflog。

-C

--copy --force 的快捷方式。

--color[=<when>]

为分支着色以突出显示当前、本地和远程跟踪分支。值必须是 always(默认)、neverauto

--no-color

关闭分支颜色,即使配置文件给出了默认颜色输出。等同于 --color=never

-i, --ignore-case

排序和过滤分支不区分大小写。

--omit-empty

在格式扩展为空字符串的格式化引用后不打印换行符。

--column[=<options>], --no-column

以列形式显示分支列表。有关选项语法,请参阅配置变量 column.branch。不带选项的 --column--no-column 分别等同于 alwaysnever。此选项仅适用于非详细模式。

--sort=<key>

基于 <key> 排序。前缀 - 以按值的降序排序。你可以多次使用 --sort=<key> 选项,在这种情况下最后一个键成为主键。支持的键与 git-for-each-ref(1) 中的相同。

-r, --remotes

列出或删除(如果与 -d 一起使用)远程跟踪分支。与 --list 结合使用以匹配可选模式。

-a, --all

列出远程跟踪分支和本地分支。与 --list 结合使用以匹配可选模式。

-l, --list

列出分支。带可选 <pattern>...,例如 git branch --list 'maint-*',仅列出匹配模式的分支。

--show-current

打印当前分支的名称。在分离 HEAD 状态下,不打印任何内容。

-v, -vv, --verbose

在列表模式下,显示每个头的 sha1 和提交主题行,以及与上游分支的关系(如果有)。如果给出两次,还打印链接工作树的路径(如果有)和上游分支的名称。

-q, --quiet

在创建或删除分支时更安静,抑制非错误消息。

--abbrev=<n>

在显示提交对象名称的详细列表中,显示至少 <n> 位十六进制数字长的最短前缀以唯一引用对象。默认值为 7,可由 core.abbrev 配置选项覆盖。

--no-abbrev

在输出列表中显示完整的 sha1 而不是缩写它们。

-t, --track[=(direct|inherit)]

创建新分支时,设置 branch.<name>.remotebranch.<name>.merge 配置条目以为新分支设置"上游"跟踪配置。

--no-track

即使设置了 branch.autoSetupMerge 配置变量,也不设置"上游"配置。

--recurse-submodules

此选项是实验性的!如果启用了 submodule.propagateBranches,则使当前命令递归进入子模块。

--set-upstream

由于此选项具有令人困惑的语法,不再支持。请改用 --track--set-upstream-to

-u <upstream>, --set-upstream-to=<upstream>

设置 <branch-name> 的跟踪信息,使 <upstream> 被视为 <branch-name> 的上游分支。如果未指定 <branch-name>,则默认为当前分支。

--unset-upstream

删除 <branch-name> 的上游信息。如果未指定分支,则默认为当前分支。

--edit-description

打开编辑器并编辑文本以解释分支的用途,供各种其他命令(例如 format-patchrequest-pullmerge(如果启用))使用。可以使用多行解释。

--contains [<commit>]

仅列出包含 <commit> 的分支(如果未指定则为 HEAD)。隐含 --list

--no-contains [<commit>]

仅列出不包含 <commit> 的分支(如果未指定则为 HEAD)。隐含 --list

--merged [<commit>]

仅列出其顶端可从 <commit> 访问的分支(如果未指定则为 HEAD)。隐含 --list

--no-merged [<commit>]

仅列出其顶端不可从 <commit> 访问的分支(如果未指定则为 HEAD)。隐含 --list

--points-at <object>

仅列出 <object> 的分支。

--format <format>

从显示的分支引用及其指向的对象插值 %(fieldname) 的字符串。<format>git-for-each-ref(1) 的相同。

配置

pager.branch 仅在列出分支时被尊重,即当使用或隐含 --list 时。默认是使用分页器。参见 git-config(1)

branch.autoSetupMerge

告诉 git branchgit switchgit checkout 设置新分支,以便 git-pull(1) 将适当地从起始点分支合并。

branch.sort

此变量控制 git-branch(1) 显示时分支的排序顺序。

branch.<name>.remote

在分支 <name> 上时,告诉 git fetchgit push 从哪个远程获取或推送到哪个远程。

branch.<name>.merge

branch.<name>.remote 一起定义给定分支的上游分支。

branch.<name>.rebase

为 true 时,在获取的分支之上变基分支 <name>,而不是在运行 git pull 时从默认远程合并默认分支。

branch.<name>.description

分支描述,可以用 git branch --edit-description 编辑。

示例

从已知标签开始开发:

bash
$ git clone git://git.kernel.org/pub/scm/.../linux-2.6 my2.6
$ cd my2.6
$ git branch my2.6.14 v2.6.14
$ git switch my2.6.14

删除不需要的分支:

bash
$ git clone git://git.kernel.org/.../git.git my.git
$ cd my.git
$ git branch -d -r origin/todo origin/html origin/man
$ git branch -D test

从特定远程列出分支:

bash
$ git branch -r -l '<remote>/<pattern>'
$ git for-each-ref 'refs/remotes/<remote>/<pattern>'

备注

如果你想创建一个要立即切换到的分支,使用带 -c 选项的 git switch 命令用单个命令执行相同操作更容易。

选项 --contains--no-contains--merged--no-merged 服务于四个相关但不同的目的:

  • --contains <commit> 用于查找如果 <commit> 被变基或修改将需要特别注意的所有分支。
  • --no-contains <commit> 是其反面。
  • --merged 用于查找可以安全删除的所有分支。
  • --no-merged 用于查找合并到 HEAD 的候选分支。

另请参阅

git-check-ref-format(1)git-fetch(1)git-remote(1)

Git

git(1) 套件的一部分

基于 CC BY-NC-SA 3.0 许可发布