我想列出只是特定分支的一部分的所有提交。

使用下面的代码,它列出了来自分支的所有提交,也包括来自父(master)的所有提交

git log mybranch

我发现的另一种选择是排除主可达的提交,并给我我想要的,但我想避免知道其他分支名称的需要。

git log mybranch --not master

我试图使用git for-each-ref,但它也列出了mybranch,所以实际上它排除了所有:

git log mybranch --not $(git for-each-ref --format '^%(refname:short)' refs/heads/)

更新:

我正在测试一个我不久前发现的新选项,直到现在看来,这可能是我一直在寻找的:

git log --walk-reflogs mybranch

更新(2013 - 02 - 13 t15:08):

——walk-reflogs选项很好,但我检查了reflogs的过期时间(默认90天,gc.reflogExpire)。

我想我找到了我一直在寻找的答案

git log mybranch --not $(git for-each-ref --format='%(refname)' refs/heads/ | grep -v "refs/heads/mybranch")

我只是从可用的分支列表中删除当前分支,并使用该列表从日志中排除。这样我只能得到只有mybranch才能到达的提交。


当前回答

我通过使用git log <branch>来做到这一点 还有一个选项是——not <branch-name> 原始文档:git-log

格式示例:

git log branch-name  --date-order --format='%ai %an <%ae> %h %f'--format='%ai , %an ,<%ae> ,%h ,%f' >> c:\log.csv

其他回答

但是我想避免知道其他分支机构名称的需要。

我认为这是不可能的:Git中的一个分支总是基于另一个分支,或者至少是另一个提交,正如“Git diff并不显示足够”中解释的那样:

您需要一个日志参考点来显示正确的提交。

正如在“GIT -我从哪里分支?”:

分支只是指向DAG中特定提交的指针

所以即使git log master. mybranch是一个答案,它仍然会显示太多提交,如果mybranch是基于myotherbranch的,本身是基于master的。

为了找到这个引用(分支的起源),你只能解析提交并查看它们在哪个分支中,如下所示:

“Git:查找提交来自哪个分支”。 “我怎么能看到另一根树枝是从哪根树枝分叉的?”

听起来你应该用樱桃:

git cherry -v develop mybranch

这将显示mybranch中包含的所有提交,但不包含在develop中。如果省略了最后一个选项(mybranch),它将比较当前的分支。

正如VonC指出的那样,您总是在将您的分支与另一个分支进行比较,因此了解您的分支,然后选择与哪个分支进行比较。

这个问题在2021年还在讨论,8年前就被问到了。我很困惑为什么没有人建议git -first parent。这难道不是现今的解决方案吗?我目前也有同样的问题,这看起来对我来说很好。我综合了这些选项:

git --first-parent --cherry  first-commit-on-branch..

我甚至从master中合并了更多的提交到我的特性分支中,但这些提交被过滤掉了,因为cherry是-cherry-pick, -right-only和-no-merges的组合。 您需要手动查找分支上的第一次提交,或者从那时起查找所有后续提交。

我需要在一行中为特定的分支导出日志。

所以我可能想出了一个更简单的解决方案。 当执行git log——pretty=oneline——graph时,我们可以看到当前分支中所有未完成的提交都是以|开头的行

所以一个简单的grep -v就可以了: Git log——pretty=oneline——graph | grep -v "^|"

当然,如果你需要其他信息,你可以改变pretty参数,只要你把它放在一行中。

您可能还想删除合并提交。 当消息以“Merge branch”开头时,再管道另一个grep -v,就完成了。

在我的具体情况下,最后的命令是: git log——pretty="%ad: %an, %s"——graph | grep -v "^|" | grep -v "合并分支"

你可以尝试这样做:

#!/bin/bash

all_but()
{
    target="$(git rev-parse $1)"
    echo "$target --not"
    git for-each-ref --shell --format="ref=%(refname)" refs/heads | \
    while read entry
    do
        eval "$entry"

        test "$ref" != "$target" && echo "$ref"
    done
}

git log $(all_but $1)

或者,借用Git用户手册中的食谱:

#!/bin/bash
git log $1 --not $( git show-ref --heads | cut -d' ' -f2 | grep -v "^$1" )