PAYATHON 2026

如何在 Git 中列出具有相同前缀的分支?

技术老齐

可以。先创建以 archive/ 为前缀的标签,再删除旧分支,以后就能从标签重建分支,继续访问原来的提交历史。这样归档的条目可以用以下命令列出:

git tag --list 'archive/*'

如果要按名称筛选本地分支,则使用:

git branch --list 'archive/*'

这两个命令分别查询标签和本地分支。

按共同前缀列出归档条目

执行:

git tag --list 'archive/*'

对于问题中的示例,结果会包含:

archive/brokenTestFeature
archive/testFeature

--list 可以简写为 -l:

git tag -l 'archive/*'

* 是通配符,匹配 archive/ 后面的任意内容。单引号可以防止 shell 提前展开通配符,让 Git 收到完整的匹配模式。相关规则见 git-tag 文档。

archive/ 只是约定的名称前缀,Git 不会因此自动执行归档操作。

创建标签,再删除旧分支

分支是指向某个提交的引用。给分支末端的提交打上标签后,即使删除分支名,也能通过标签找到该提交,以及沿父提交关系可达的历史。

先处理好未提交的修改,再切换到要保留的分支:

git checkout master

创建归档标签:

git tag archive/testFeature testFeature
git tag archive/brokenTestFeature brokenTestFeature

确认标签都已成功创建后,删除旧分支:

git branch -d testFeature
git branch -d brokenTestFeature

如果两次删除都成功,git branch 的输出中就只剩 master 和 FixedTestFeature。当前分支前会带有 *,显示顺序可能与问题中的示例不同。

创建标签不会让 git branch -d 跳过合并检查。-d 要求待删除分支已完整合并到其上游分支;如果没有配置上游,则检查它是否已合并到当前 HEAD。所以,即使标签已经存在,未合并的 brokenTestFeature 仍可能无法删除。详见 git-branch 文档。

如果确定要归档尚未合并的分支,先核对标签是否确实指向原分支末端,再考虑使用:

git branch -D brokenTestFeature

-D 会跳过合并检查。待删除分支也不能正在当前工作区或其他关联 worktree 中被检出。

从标签恢复分支

问题中的恢复命令是正确的:

git checkout -b testFeature archive/testFeature

这条命令会创建本地分支 testFeature,使其指向标签标记的提交,并切换到该分支。前提是本地没有同名分支,且切换不会覆盖未提交的修改。具体行为见 git-checkout 文档。

恢复后,testFeature 会重新出现在 git branch 的输出中。原来的提交及其祖先历史仍然可用,提交哈希也不会因删除、重建分支而改变。

标签保存的是提交位置。删除分支时,该分支的 reflog 也会删除;从标签重建分支不会恢复原分支的 reflog 或上游配置。因此,这种方式能保留提交历史,但不能保留分支的全部本地元数据。

如果只是查看历史或比较代码,无须恢复分支:

git log archive/testFeature
git diff archive/testFeature master

如果只想临时检出归档版本,可以执行:

git checkout --detach archive/testFeature

这会进入 detached HEAD 状态。如果要继续开发并保留新提交,使用前面的 git checkout -b 更合适。

本地归档还需要注意什么

归档标签默认只存在于本地。仅推送 master,并不意味着服务器已经保存了这些标签及其引用的全部提交。如果需要在其他机器恢复,还应单独推送归档标签或备份仓库。

checkout 用于切换到旧版本,git revert 用于生成抵消指定提交改动的新提交。归档标签可以帮助定位历史,执行 revert 前仍需确认具体要撤销哪些提交。

备注:内容仅供参考。