如何在 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 前仍需确认具体要撤销哪些提交。
备注:内容仅供参考。
