如何按最近的检出时间对git分支输出排序

5
我有很多本地分支。 运行git branch会列出它们并且它们超出了页面范围。 我经常希望在当前检出的分支和我上次使用的分支之间切换,或者可能是上一个使用的分支。 这个过程是通过浏览20-30个本地分支列表或者如果我足够幸运记得一个关键字(或票号)则使用命令+f进行查找。
相反,我想说git branch并让它按照检出顺序显示分支。 就像您在许多程序中看到的按照最近活动排序的项目列表一样。 这似乎是显而易见的默认选择的排序依据,我很惊讶它不是git的默认值。
编辑:
我修改了我的问题,只询问按检出排序的方法。 我无法找到一个筛选每个分支的最近检出日期的输出的排序谓词。

1
我不太确定这是否是您想要的:git reflog --pretty="%D" | grep -v ^$(我相信有更好的方法来做到这一点)。 - musicmatze
最近的提交和最近的检出是两个非常不同的指标。 - jthill
@jthill,这就是为什么我编辑了我的问题,让它们关注我关心的那个。我有什么遗漏吗? - Alex Bollbach
这个回答解决了你的问题吗?如何获取我最近检出的Git分支列表? - Bergi
显示剩余2条评论
3个回答

4
按照检出顺序(而非最后提交的顺序)列出分支:
git log -g --grep-reflog "checkout:" --format="%gs" | cat -n | sed -E "s/^\s+([0-9]+).*from (.*) to .*/\1 \2/g" | tac

您可以使用以下命令之一查看其中一个:
git checkout @{-nnn}

这里的nnn是指分支名前显示的数字。要在当前分支和上一个分支之间切换,只需使用:

git checkout -

你可以将以上命令组合成新的git命令,如下所示:
git config --global alias.lb '!git log -g --grep-reflog "checkout:" --format="%gs" | cat -n | sed -E "s/^\s+([0-9]+).*from (.*) to .*/\1 \2/g" | tac; read -p "Aussuchen: " i; git checkout @{-$i}'

使用

git lb

显示最近使用的分支并选择其中一个。

1
注意:某些环境(如macOS)没有tac。因此请改用| tail -r。或者更有用的是,将alias tac='tail -r'添加到您的shell的rc/profile文件中。我也遇到了sed操作的问题,所以这是我在macOS上获取最后25个的最终命令:git log -25 -g --grep-reflog "checkout:" --format="%gs" | sed -E "s/^checkout: moving from (.*) to.*/\1/g" | cat -n | tail -r - AndrewF
1
为此,我将添加 | sort | head -n 5 以仅显示最新的 5 个分支,并按时间顺序排序。 - dstandish

1

你尝试过使用for-each-ref选项吗?有很多可排序的字段。

这里有一个按authordate排序的例子。

 git for-each-ref  --sort='-*authordate'

当我在自己的一组较小的分支上进行测试时,最近创建/检出的分支位于顶部。
看起来这些是git-ref结构中唯一的日期/时间字段:
"authordate"
"committerdate"
"taggerdate"
"creatordate"

通过尝试以下命令获取文档,您可以在此处了解更多信息:

git for-each-ref --help

也许可以编写一个脚本,检查 .git/refs/heads 是否有更新?

谢谢。但我没有看到任何按照结账日期排序的内容。最近检出和最近提交恰好重合可能只是巧合。对于像我这样经常检出各种分支而不提交任何工作的人来说,这种巧合很少发生。 - Alex Bollbach
@AlexBollbach 我猜这是 git-ref 没有支持的日期之一。我已经更新了答案,并列出唯一的 4 个看起来像日期/时间字段的内容。所以你似乎可以按照你提交的顺序排序,但是除了某些批处理脚本中的棘手目录时间戳检查外,按照检出日期本身进行排序似乎不是 Git 的本机功能。:/ 在我手头可用的测试用例并不复杂/大到足以暴露所建议的答案中的缺陷。 - DDeMartini
当然,我相信一个足够害羞的程序员可以想出一些非本地方法来实现这个。 - Alex Bollbach

1
我经常想在当前选中的分支和上次工作的分支之间切换,或者可能是上上次的分支。
感谢您描述了给您带来困难的情况,并询问如何实现您正在尝试的解决方案。
Git有一种非常直接的处理方式。要重复上次工作的检出,请
git checkout @{-1}

并且重复倒数第二个

git checkout @{-2}

使用命令 git rev-parse --abbrev-ref @{-1} 获取分支名称,使用命令 git show @{-1} 获取提交的详细信息。 - math2001

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接