跳至主要内容

Git 分支列表:实用指南

学习如何使用 git branch 列出本地与远程 Git 分支并进行筛选。掌握用 git fetch、git checkout 与 git prune 进行故障排查。
· 9分钟 阅读

使用 AI 探索

如果您曾同时开发多个功能,这种情况也许很熟悉:您运行了一个Git 命令,结果突然不确定上周的工作到底在什么分支里了。

随着项目规模扩大,这个问题会更常见。早期,一个代码库可能只有一个 main 分支。但随着时间推移,团队会为新功能、缺陷修复、试验、发布以及紧急热修复创建分支。

这就是为什么在 Git 中列出分支变得至关重要。它能帮助回答一些实际问题:

  • 我当前正在什么分支上工作?
  • 我的机器上还有哪些分支?
  • 远程仓库上存在哪些分支?

本指南将介绍在 Git 中列出分支的基础知识、具体方法,以及如何排查常见问题。

如果您对 Git 还完全陌生,建议先学习我们的 Introduction to Git 课程,先建立信心,再深入分支管理等更细化的话题。

理解 Git 分支

在开始列出分支之前,先来拆解一下什么是 Git 分支。

一个常见的误解是:Git 分支是独立的文件夹或代码库的完整拷贝。但实际上,Git 分支只是指向某个特定提交的轻量级指针。

您可以把它想象为一条并行的时间线,您可以在其中独立地构建功能或做实验,而不会影响稳定的主干代码。这种架构让创建和合并分支变得极其快速高效。

git branch

来源:Git

Git 使用一个名为 HEAD 的特殊引用来跟踪您在这些时间线中的当前位置,它始终指向您当前正在工作的分支。由于分支只是指针,切换上下文是瞬时完成的,并不需要搬动大量文件。

想了解更多,请查看我们的 Git 分支 教程,或参阅我们的 Git 速查表。

如何在 Git 中列出本地分支

有了以上概念基础,来看如何列出您仓库中的本地分支。

本地分支是存在于您电脑上的分支。它位于仓库的 .git 文件夹中,表示指向一系列提交的可移动指针。您可以切换到某个本地分支,在其上进行更改并创建新提交。

可以这样理解本地分支:

  • 它们属于您这份仓库拷贝
  • 当您提交新更改时,它们会向前移动
  • 当他人推送代码时,它们不会自动更新

使用 git branch

列出本地分支最常用、最基础的命令非常直观:

git branch

当您不带任何附加选项运行该命令时,Git 会显示所有本地分支。

关于 git branch 需要记住的重要事项:

  • 它只显示本地分支,不显示远程分支
  • 它不会访问互联网
  • 它不会更改文件、提交或分支历史

由于安全且快速,很多开发者会在开始新工作或切换上下文前,习惯性地运行 git branch。

理解输出

以下是 git branch 可能显示的示例:

 bugfix/login-timeout
  feature/payment-refactor
* main

尽管输出很简单,但其中包含几个关键信息。

首先,星号(*)表示当前检出的分支。这是当前工作目录所关联的分支。您创建的任何新提交都会进入该分支。

其次,Git 通常会将当前分支以绿色高亮显示。这只是终端提供的视觉辅助,并不会改变 Git 的行为。

第三,请注意未显示的内容:

  • 没有提交日期
  • 没有作者名称
  • 没有远程信息

这是刻意为之。Git 保持默认输出简洁,便于快速浏览并与其他命令组合使用。

新手提示:如果您的终端在运行 Git 命令后看起来“卡住”了,尝试按 q。Git 常会使用分页器显示长输出,这是一种正常的退出方式。

只获取当前分支

有时没必要列出所有分支。您可能只想知道当前所在的分支。Git 提供了专门命令:

git branch --show-current

输出仅为分支名:

main

常见使用场景包括:

  • 在推送代码前检查当前分支
  • 在脚本中记录分支名
  • 在自动化或 CI 流水线中使用分支名

如果 Git 处于分离的 HEAD 状态,该命令将不返回任何内容。虽然起初看起来有些奇怪,但在编写需要检测是否检出到分支的脚本时,这实际上很有用。

常见误解:有些用户在没有显示分支名时会以为 Git “坏了”。多数情况下,这只是意味着您当前不在某个分支上,而是位于某个特定提交。

如何在 Git 中列出远程分支和所有分支

列出远程或所有分支与列出本地分支的方法非常相似。

列出 Git 中的远程分支

像 GitHub 或 GitLab 这样的远程仓库有自己的分支。要查看它们,请添加 -r 标志:

git branch -r
  origin/HEAD -> origin/main
  origin/bugfix/login-timeout
  origin/feature/payment-refactor
  origin/main

这个示例输出起初可能有些困惑,我们来拆解一下。

您看到的是远程跟踪分支。这些是 Git 用来记录远程仓库最新已知状态的本地引用。

需要理解的要点:

  • 这些分支存储在本地
  • 只有在您 fetch 时才会更新
  • 它们不会自动移动

新手提示:可以把远程跟踪分支看作 Git 的“笔记本”。Git 会写下您上次查看时远程的样子,但除非您明确地 fetch,否则它不会更新这本“笔记本”。

列出 Git 中的所有分支

要同时查看本地分支和远程跟踪分支,请使用 -a 标志:

git branch -a
* main
  feature/payment-refactor
  remotes/origin/bugfix/login-timeout
  remotes/origin/main

这种组合视图有助于您理解本地分支与远程分支之间的关系。

需要留意的命名模式:

  • 本地分支以 main 这样的简单名称出现

  • 远程跟踪分支显示为 remotes/origin/ 下的路径

在决定是否创建跟踪现有远程分支的新本地分支时,这个视图尤其有用。如果您需要克隆一个仓库并在特定分支上工作,请查看我们的指南:如何在 Git 中克隆特定分支。

先 fetch 再说

如果同事推送了一个新分支而您看不到,最常见的原因是您的本地缓存已过期。

解决方法是fetch:

git fetch

git fetch 会做什么:

  • 从远端下载最新的分支信息
  • 更新您的远程跟踪分支
  • 不改变您的工作文件

该命令在任何时候运行都是安全的。它不会合并代码,也不会覆盖您的工作。很多团队会把 git fetch 当作查看分支前的例行步骤。

常见错误:新手常把 git fetch 和 git pull 混淆。Fetch 只更新分支信息,而 Pull 还会把更改合并到您当前的分支。

如何获取更多分支列表细节

有时仅有分支名还不够。如果您想查看更多信息,可以使用一些有用的标志。

查看最后一次提交

要查看每个分支当前包含的内容,使用:

git branch -v

输出可能如下:

* main   a1b2c3d Fix typo in README
  feature/payment-refactor e4f5g6h Refactor payment service

如您所见,-v 标志会添加重要上下文:

  • 简短的提交哈希显示分支当前指向的位置
  • 提交消息提示该分支的目的

这是在不切换分支的情况下理解分支用途的最简单方法之一。

新手提示:如果您不确定某个分支是否可以安全删除,查看其最后一次提交消息是一个不错的第一步。关于删除分支的完整指南,请参阅我们的教程:如何删除 Git 分支。

检查上游关联

本地分支通常会跟踪相应的远程分支。要查看这种关系,运行:

git branch -vv
* main   a1b2c3d [origin/main] Fix typo in README
  feature/payment-refactor e4f5g6h [origin/feature/payment-refactor] Refactor payment service

该输出会告诉您:

  • 您的本地分支链接到哪个远程分支

  • git pull 将从哪里拉取

  • git push 将推送到哪里

如果某个分支没有上游,它的方括号部分将为空。这往往能解释推送或拉取时报错的原因。

常见错误:在没有上游的分支上尝试运行 git pull 通常会失败。在这种情况下,您需要先设置一个上游分支,或首次推送该分支。

按日期或版本排序分支

要查找最近活跃的分支,可以按提交日期排序:

git branch --sort=-committerdate

这会将最近更新的分支置顶,较早的分支位于底部。

对于包含版本化分支的仓库,语义排序更有用:

git branch --sort=v:refname

这会遵循版本号排序,避免令人困惑的字母序。

如何在 Git 中筛选分支列表

如果您在查找特定分支,筛选会非常有用。我将演示如何用几个重要标志来实现。

按名称模式搜索

尤其在大型仓库中,按名称筛选能让您更快找到目标分支。您可以结合 --list 标志和搜索词按名称筛选:

git branch --list 'feature/*'

请注意 * 作为通配符使用:结果只显示匹配该模式的分支,即以 feature 开头的分支。团队通常使用 feature/、bugfix/ 或 hotfix/ 等前缀来保持有序。可以把它们看作分支的“文件夹”。

查找已合并与未合并的分支

两个非常重要的筛选器是:

git branch --merged
git branch --no-merged

这些命令会将其他分支与您当前分支进行比较。

  • --merged 显示其工作已被包含的分支(了解更多 Git 合并)

  • --no-merged 显示仍包含独有提交的分支

安全提醒:在使用 --merged 之前,务必再次确认您位于正确的基准分支(通常是 main 或 develop)。结果取决于您当前所在分支。

查找包含某次提交的分支

如果您知道一个提交哈希并想知道它存在于哪些分支中,使用:

git branch --contains <commit-hash>

这在追踪缺陷或验证修复是否已被合并时很有用。

例如,当同事告诉您:“我在这个提交哈希里发现了一个 bug;哪些分支会受影响?”您可以使用此命令精准定位 bug 的所在分支。

组合筛选以支持高级流程

我展示的这些筛选器可以组合使用,以进一步缩小结果范围。来看一个示例:

git branch --list 'feature/*' --no-merged

该命令能快速显示所有未合并的 feature/ 分支,帮助团队保持有序。

排查常见问题

如果遇到问题别担心;最常见的问题都很容易解决。

缺失远程分支

如果您看不到他人已推送的分支,最可能的原因是您忘了 fetch。排查步骤:

  1. 运行 git fetch

  2. 然后再次列出分支

如果问题确实是缺少 fetch,这个快速步骤会立刻更新您的本地视图。

分离的 HEAD 状态

有时,git branch 的输出看起来像这样:

* (HEAD detached at a1b2c3d)

这意味着您不在某个分支上,而是直接查看某个特定提交。

分离的 HEAD 状态本身并不危险,但若您在此状态下产生新提交,除非创建分支,否则之后可能难以找到它们。

要回到正常工作状态,切换到一个已有分支:

git checkout <branch-name>

现代替代方案:自 Git 2.23+ 起,您可以使用 git switch <branch-name>,这是一条专为切换分支设计的更简洁、更安全的命令。

您也可以使用 -b 标志从当前位置创建新分支:

git checkout -b <new-branch-name>

删除后分支仍然出现

如果远程分支在服务器上已删除,但本地仍然显示,您可以使用以下命令清理其本地引用:

git remote prune origin

这会清理陈旧引用,保持仓库整洁。

高手提示: 作为替代方案,您也可以在每次 fetch 时使用 git fetch --prune,这样仓库在更新的同时也完成清理。

结语

在 Git 中列出分支是一项关键技能,能帮助您理解自己的仓库。本文介绍的命令和标志将帮助您避免失误,并与他人更自信地协作。

在启动新项目时,通常值得思考需要怎样的分支结构。想获得一些建议,请参阅这篇关于 Git 分支策略 的指南。

准备好超越基础了吗?前往 Git Fundamentals 技能路径,系统掌握从入门到进阶所需的概念与实操经验。

Git 分支列表常见问答

本地分支与远程分支有什么区别?

本地分支存在于您的机器上。远程分支反映远程仓库上各分支的状态。

如何知道哪些分支已被合并?

运行 git branch --merged,即可查看其更改已包含在当前分支中的分支。

列出分支后,删除分支是否安全?

可以,如果它已被合并。使用 git branch -d branch-name。如果尚未安全合并,Git 会阻止删除。Git 认为分支“安全”的条件是:它已合并到您当前分支,或它已被推送到远程仓库。

为什么我看不到远程上已存在的分支?

很可能是本地仓库尚未 fetch。先运行 git fetch,然后使用 git branch -r 查看远程分支。

git branch 会显示什么?

它仅列出您的本地分支。当前分支会用 * 标记。只有添加 -r 标志时才会显示远程分支。

如何按最近活动排序列出分支?

使用 git branch --sort=-committerdate 可将最近有提交的分支显示在顶部。当您想找到自己或团队近期处理过的分支时很有帮助。您还可以与其他标志组合,例如 git branch -v --sort=-committerdate,以在排序列表中同时查看提交消息。

Austin Chia

作者

Austin Chia

我是 Austin,一名博主和科技作者,曾在医疗领域担任数据科学家与数据分析师,拥有多年的从业经验。我以生物学背景开启技术之路,如今通过我的科技博客帮助他人完成同样的转型。我对技术的热情促使我为数十家 SaaS 公司撰写内容,分享经验、启发他人。

主题