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

使用下面的代码,它列出了来自分支的所有提交,也包括来自父(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才能到达的提交。


当前回答

我发现这种方法相对简单。

结帐到分行和比

运行 -2 HEAD . git

这将只提供两个sha:

1)分支的最后一次提交[C1]

2)和提交父分支的第一次提交[C2]

现在运行 git log——decoration——pretty=oneline——reverse——name-status <C2>..<C1> .

这里C1和C2是运行第一个命令时将得到的两个字符串。在第二个命令中输入这些不包含<>的值。

这将给出分支内文件更改历史的列表。

其他回答

我通过使用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 Flow和GitHub。你所需要做的就是:在GitHub上比较你的功能分支和开发分支。

它将只显示提交到您的特性分支。

例如:

https://github.com/your_repo/compare/develop...feature_branch_name

从上面的评论中我看到-你只希望那些提交属于该分支,而不是它的父分支。但从技术上讲,当你从另一个分支创建一个分支时,这些提交也会复制到子分支。 但是对于你的问题,下面的命令是有用的。

git log childBranch...parentBranch

如果父分支是远程分支,可以使用以下命令。

git log yourBranch --not --remotes=origin

这是有效的:这完全符合你的要求:

for a in $(git rev-list anybranch..mybranch); do echo -n "$a "; git branch --contains $a | xargs; done

你可以使用严格的git rev-list——但如果你只关心某个分支上的提交,而不关心其他地方的提交,那么选择任何你认为自己来自的分支至少会限制实际的明显差异,而且你可以一眼看出哪些提交只属于该分支。

选项1(似乎更快,但你可能会得到错误bash: /mingw64/bin/git:参数列表在git bash中太长(它在Linux中工作),这取决于你的项目有多少分支)

Git log <your_branch>——not $(Git branch -a | grep -v <your_branch> | grep -ve '->' | sed "s/\s//g")

选项2

git - rev-list <your_branch> | git -rev -stdin | sed -E 's/~[0-9]+//g;s / \ ^ [0 - 9] + / / g”| grep”< your_branch >”| awk - f”“{打印$ 1}’