如何让git显示所有本地分支中最近的n个提交记录

4

我希望能够查看我的代码库中所有本地分支的最新n次提交(通常为1或2次)。

我尝试过使用“git log -1 --all”和“git log -1 --branches”,但在git 1.8.4中没有达到我预期的效果。

基本上,我想要的是与以下命令相当:

for i in $(ls .git/refs/heads/); do echo ====$i====; git log -1 $i; done

1
为什么不把它做成别名? - kaman
如果你所说的“活跃分支”是指“那些引用尚未被移动到packed-refs或自那时以来已经更新的分支”,那么上面的方法基本上是可行的。不过,你可能需要添加一些处理包含斜杠的分支名称的内容。 - torek
1
@chris: 现有的解决方案依赖于我作为存储库根文件夹。我希望能够从任何地方执行。另外,如果使用原生git工具,可以传递其他命令行参数以获得更强大的功能。如果尝试编写一个完成所有这些任务的脚本,很快就会变得复杂,我的时间最好花在学习已经存在的内容上(假设存在这样的内容)。 - Spacemoose
@Spacemoose:这在问题的标题中(它卡在我的脑海中,以至于我没有看到“本地分支”)。 - torek
1
@Chris 如果分支名称中有斜杠,则根本无法工作。 - NoBugs
显示剩余2条评论
2个回答

4

编辑,2018年8月:如果您只想查看每个分支最新提交中的一个,这里有一个快捷方式:

git log --no-walk --branches

这个命令的作用是,--no-walk选项可以防止git log查看任何未在命令行上指定名称的提交记录,而--branches选项则在命令行上指定每个分支尖端提交记录的名称。
--branches--tags--remotes选项都可以使用可选的通配符模式,因此您可以使用git log --no-walk --branches='m*'来查看所有以m开头的提交记录。)
本地(即“非远程”)分支是其引用名称以refs/heads/开头的分支。 git for-each-ref命令旨在迭代引用名称,因此通常应使用它:
git for-each-ref --format='%(refname:short)' refs/heads

将它们全部打印出来。请注意,您不能仅向 git log -1 传递它,因为这将在记录第一个引用的一个提交后停止; 因此您需要像您所做的那样进行一些操作。有许多构建此内容的方法,例如:

git for-each-ref --format '%(refname:short)' refs/heads | \
    while read branch; do git log -1 $branch; done

或者:

git for-each-ref --format='git log -1 %(refname:short)' refs/heads | sh

在第二种情况下,您应该添加--shell以确保所有扩展被引用。这可以防止出现名为foo$bar的分支等问题。

0

通过使用以下命令可以获取包含所有分支及其最后提交的列表:

git branch -vv

如果您需要更详细的信息,或者需要返回变量数量的提交记录,那么您自己的解决方案已经很不错了。您可以通过将以下内容添加到~/.gitconfig创建一个git别名:

[alias]                                                                         
    log-all-branches = "!sh -c 'git_dir="$(git rev-parse --show-toplevel)/.git/refs/heads/"; for i in $(ls $git_dir); do echo ====$i====; git log -n $1 $i; done' -"

现在你可以通过执行git log-all-branches 2获取每个分支的最后2个提交。

这是一个不错的开始,但是OP提到必须在根目录下的观点很好。您可能希望将git rev-parse --git-dir纳入考虑。 - Chris
谢谢指出。在原帖作者在评论中指明后,我已经将我的答案中的命令进行了调整。 - Bas Peeters

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