Git log:列出所有父项提交

时间:2013-10-18 04:06:09

标签: git github git-log

在共享的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,但我发现无法禁用或反转它。

2 个答案:

答案 0 :(得分:2)

如果您没有进行合并并且使用--no-ff在分支提示处进行实际的合并提交将是一个不可靠的指标,所以如果您只是不想看到合并提交,< / p>

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

sed:

/^[^ ]* [^ ]* /!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

并且^! suffix告诉log不会自动包含父母。

答案 1 :(得分:0)

一种可能的解决方案是使用--graph然后使用一些sed和grep魔法。 这种方法很有效,但它很骇客,希望git-log能为我做到这一点!

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

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

第一个sed删除了分支&#34; ascii art&#34; --graph模式输出。 第一个grep删除所有合并提交。 第二个grep删除空行。