5

在共享的 GitHub 存储库中,我想用它git log来显示最近提交的列表。

当前的历史类似于以下内容:

                       (master)
B------Merge1--Merge2--Merge3
      /       /       / 
 - -C1       /       /
      - - -C2       /
 - - -C3----------C4

提交Merge是合并拉取请求的结果,并且C提交来自此存储库的分支。

git log显示如下内容:

git log --oneline master
    Merge3
    Merge2
    Merge1
    B

但我真正感兴趣的是C提交。 git log --graph是我发现显示 C1、C2 和 C3 的唯一可能方式。

是否有任何其他选项(不涉及--graph)可以显示 C1、C2 和 C3?

我希望能够做这样的事情

git log --oneline --no-merges <...insert magic here...> master
 C4
 C3
 C2
 C1
 B

我在手册页中发现的唯一明智的事情是--first-parent,但我找不到禁用或反转它的方法。

4

2 回答 2

2

如果您没有进行合并并--no-ff在分支提示处进行实际合并提交,那么这将是一个不可靠的指标,因此,如果您只是不想看到合并提交,

git log --no-merges --oneline -n 10   # or --since, or something, might do 

如果您想根据提交属性决定回到列表的距离,rev-list 没有作为内置截止标准,只需在输出中过滤这些属性rev-list或更一般地选择某些log --pretty=format:选择,这里是一个仅列出从合并分支到选定分支的提示,得到 C1-C2-C4 - 因为我不知道你是如何决定绕过 C4 ...

#!/bin/sh
git rev-list --parents "${@-HEAD}" \
| sed -n '/^[^ ]* [^ ]* /!q;s///;s/[^ ]*/&^!/gp' \
| xargs git log --oneline

赛德:

/^[^ ]* [^ ]* /!q      # quit at first rev with less than two parents
s///                   # strip rev and its first parent
s/[^ ]*/&^!/gp         # append ^! to all other (merged) revs

并且^!后缀告诉log不要自动包含父母。

于 2013-10-18T04:35:21.463 回答
1

一个可能的解决方案是使用--graph一些 sed 和 grep 魔法。这有点工作,但它很hacky,希望git-log能够为我做到这一点!

我认为它需要额外的选项来显示正确的顺序,而不是按提交日期。

git log --oneline --graph     \
| sed -e 's|[^a-z0-9]*||1'    \
| egrep -v '^[a-z0-9]+ Merge' \
| egrep -v "^$"

第一个sed删除--graph模式输出的分支“ascii art”。第一个grep删除所有合并提交。第二个grep删除空行。

于 2013-10-18T07:02:22.317 回答