仅显示作为我提交之一的父项的提交?

时间:2019-07-04 10:07:58

标签: git git-extensions

我在一个大型团队中工作,因此有很多其他开发人员的功能分支,都起源于“ master”分支。

我经常自己处理多个功能分支,所以我想只列出“我的”分支”:

  • 从我是作者的所有提交开始,或者缩小到上个月。
  • 显示这些信息以及所有其祖先,而不管作者如何。

如何在命令行上执行此操作?

奖金:我经常使用Git Extensions与git repos进行交互。
其默认视图显示整个DAG。

enter image description here

但是,它允许用户通过直接为git log命令指定参数来过滤此视图,因此我希望该命令行解决方案也可以在GUI世界中移植。

2 个答案:

答案 0 :(得分:0)

git log --pretty="%h %p" --author=<Name> --since="1 month ago"

每一行都有一个或多个提交。第一个是作者为您且年龄小于1个月的提交,其余为其父母。可以根据需要将额外的占位符和单词添加到格式字符串中。

答案 1 :(得分:0)

可以获得git log来执行此操作,但是您必须将其分为两个部分。

第一部分是提取您关心的所有起点提交,为此,git log –或其管道姊妹命令git rev-list –需要通常的--since和/或--until用于日期范围限制,--author用于选择以您为作者的提交。使用git rev-list时,默认输出只是所选提交的哈希ID列表。

现在您已将选定的提交作为起点哈希ID,只需在每个此类哈希ID上运行git log。毕竟,git log的作用是:

  • 查找所有指定哈希ID的命令行参数。如果没有这样的参数,请使用HEAD。这些是起始提交哈希ID:将它们放入优先级队列。默认优先级是较新的提交(较晚的提交者时间戳记)排在队列的前面,较旧的提交排在后面。

  • 现在队列已准备就绪,运行循环:

    • 从队列中提取提交。
    • 显示它,除非由于其他参数(例如,文件路径名参数,也将启用“历史记录简化”)而不会显示。
    • 将其父项放入队列中,除非出于简化历史记录或--first-parent的原因将某些或全部不放入队列中。


    ,此循环一直运行到队列为空或提交显示限制计数(来自-n number或等效参数)为止。

请注意,如果您从单个提交哈希ID(例如HEAD产生的ID)开始,则循环仅从队列中的一个提交开始,然后将其删除并显示。如果该提交有一个父对象,则一个父对象进入队列,该父队列现在的长度为1,因此Git将那个父对象带出队列,显示 it ,然后将 its < / em>父级加入队列-长度又为1。一直重复直到队列变大(合并时)或到达根提交为止,这就是为什么简单存储库中的简单git log有一些分支但没有合并的原因,它仅显示当前的提交分支(HEAD)。

不过,对于您而言,该循环是您的第二部分:

  

显示这些信息以及所有其祖先,而不管作者如何。

第一部分-放入优先级队列中的提交哈希ID集合-正是git rev-list --author='...' --since=...所打印内容的输出。

唯一棘手的部分在于将git rev-list打印的内容(选定的哈希ID)连接到git log命令中。如果您使用的是类似Unix的shell,例如bash,则可以通过命令替换来实现:

git log $log_args $(git rev-list $rev_list_args)

这将运行git rev-list(带有任何参数),获取其输出,将换行符替换为空格, 1 ,然后运行git log $log_args,并使用由{{1 }}的输出。

此命令替换技巧有一个小缺陷:某些系统具有最大数量的参数。如果git rev-list打印的提交哈希ID太多,则会出现错误:参数列表太长。要解决此问题,git rev-list允许您指定所有开头使用git log标志将 input 指向git log

--stdin

您可能希望在git rev-list $rev_list_args | git log $log_args --stdin 中包含--decorate,以便$log_args在显示特定提交时将打印指向特定提交的任何分支或标记名称。 (请注意,git log控制是否隐含log.decorate,并且--decorate长时间以来默认为log.decorate,因此,除非您明确要求不使用它,否则除非您将auto的输出通过管道传输或将其重定向到文件。)


1 对于Git来说,关键的部分不是换行到空格的转换,而是被命令替换的命令的输出被分割成单独的自变量的事实。但是,对于其他一些命令,命令替换的细微细节变得很重要。