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

-m, --move ​

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

-M ​

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

-c, --copy ​

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

-C ​

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

--color[=<when>] ​

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

--no-color ​

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

-i, --ignore-case ​

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

--omit-empty ​

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

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

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

--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>.remote 和 branch.<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-patch、request-pull 和 merge(如果启用))使用。可以使用多行解释。

--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 branch、git switch 和 git checkout 设置新分支,以便 git-pull(1) 将适当地从起始点分支合并。

branch.sort ​

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

branch.<name>.remote ​

在分支 <name> 上时,告诉 git fetch 和 git 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 许可发布