Git无内置“最近三个分支”快捷切换命令,因reflog默认仅存90天记录且detached HEAD操作不被记录,需用git reflog --format="%gs"提取checkout行为并去重筛选,或改用git worktree为高频分支建固定目录实现确定性秒切。

Git 没有内置“最近三个分支”快捷切换命令
Git 本身不记录分支访问时间,git checkout 或 git switch 都无法直接按“活跃度”排序。所谓“最活跃的三个分支”,实际得靠 shell 历史、reflog 或自定义脚本推断——最可靠的是用 git reflog 查看本地 HEAD 移动记录,它天然按时间倒序列出你最近 checkout/switch 过的分支。
用 reflog 提取最近三次 checkout 的分支名
git reflog 里每行形如 abc1234 HEAD@{0}: checkout: moving from main to develop,关键信息在冒号后。提取最近三次非重复分支的实操命令如下:
git reflog --format="%gs" | grep "checkout: moving from" | sed -E 's/.* to ([^ ]+)$/\1/' | head -n 20 | awk '!seen[$0]++' | head -n 3
说明:
-
--format="%gs"只输出 reflog 的“动作描述”部分,避免哈希和时间干扰 -
grep "checkout: moving from"过滤出分支切换行为(排除 commit、rebase 等) -
sed提取to后面的分支名,注意它可能含空格(如feature/login-v2),所以用[^ ]+而非\w+ -
awk '!seen[$0]++'去重,防止同一分支被反复切换多次后挤掉其他分支 -
head -n 20先取足够多条再筛,避免去重后不足三条
绑定为 shell 别名实现一键切换
把上面逻辑封装成别名,加到 ~/.zshrc 或 ~/.bashrc:
alias gb3='git reflog --format="%gs" | grep "checkout: moving from" | sed -E "s/.* to ([^ ]+)$/\1/" | head -n 20 | awk "\!seen[\$0]++" | head -n 3'
然后定义快速切换函数:
对 GitHub Actions 工作流 YAML 文件进行 lint 与验证,检查常见错误、安全隐患、已废弃的操作以及最佳实践。适用于要求进行代码检查、验证等场景。
gco3() {
local branches=($(gb3))
case ${#branches[@]} in
0) echo "No recent branches found"; return 1 ;;
1) git switch "${branches[0]}" ;;
2) git switch "${branches[0]}"; echo "→ ${branches[0]}, fallback: ${branches[1]}" ;;
3) git switch "${branches[0]}"; echo "→ ${branches[0]}, others: ${branches[1]} ${branches[2]}" ;;
esac
}执行 gco3 就直接切到最近一次 checkout 的分支,并提示其余两个。注意:
- 该函数依赖
git switch(Git 2.23+),若用老版本 Git,请替换为git checkout -
reflog默认只保留 90 天记录(gc.reflogExpire),长期不用的分支会消失 - 如果某次 checkout 是通过哈希或 detached HEAD 方式进入的,
reflog中不会出现to branchname,会被自动跳过
比 reflog 更稳定的替代方案:用 git worktree 管理高频分支
如果“最活跃三个分支”其实是你日常并行开发的固定组合(比如 main、develop、feature/x),reflog 反而容易受临时操作干扰。更可控的做法是用 git worktree 为它们分别建独立目录:
git worktree add ../my-main main git worktree add ../my-develop develop git worktree add ../my-feature feature/x
之后只需 cd 到对应目录即可秒切,且每个工作区独立 stash、index 和配置。缺点是磁盘占用略高,但换来的是确定性——不会因为某次 git checkout 误操作就打乱“活跃顺序”。
reflog 方法轻量但有边界,worktree 方法重一点但可预期。选哪个,取决于你口中的“最活跃”到底是“刚切过”还是“常驻开发”。

















