我想列出只是特定分支的一部分的所有提交。
使用下面的代码,它列出了来自分支的所有提交,也包括来自父(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 --graph [branchname]
git log --graph origin/[branchname] # if your local checkout isn't up to date
该命令将以图形的格式显示从所提供的分支可到达的所有提交。但是,通过查看提交图(*是提交行中第一个字符),您可以轻松地过滤该分支上的所有提交。
例如,让我们看看下面cakephp GitHub repo上git log -graph master的摘录:
D:\Web Folder\cakephp>git log --graph master
* commit 8314c2ff833280bbc7102cb6d4fcf62240cd3ac4
|\ Merge: c3f45e8 0459a35
| | Author: José Lorenzo Rodríguez <lorenzo@users.noreply.github.com>
| | Date: Tue Aug 30 08:01:59 2016 +0200
| |
| | Merge pull request #9367 from cakephp/fewer-allocations
| |
| | Do fewer allocations for simple default values.
| |
| * commit 0459a35689fec80bd8dca41e31d244a126d9e15e
| | Author: Mark Story <mark@mark-story.com>
| | Date: Mon Aug 29 22:21:16 2016 -0400
| |
| | The action should only be defaulted when there are no patterns
| |
| | Only default the action name when there is no default & no pattern
| | defined.
| |
| * commit 80c123b9dbd1c1b3301ec1270adc6c07824aeb5c
| | Author: Mark Story <mark@mark-story.com>
| | Date: Sun Aug 28 22:35:20 2016 -0400
| |
| | Do fewer allocations for simple default values.
| |
| | Don't allocate arrays when we are only assigning a single array key
| | value.
| |
* | commit c3f45e811e4b49fe27624b57c3eb8f4721a4323b
|\ \ Merge: 10e5734 43178fd
| |/ Author: Mark Story <mark@mark-story.com>
|/| Date: Mon Aug 29 22:15:30 2016 -0400
| |
| | Merge pull request #9322 from cakephp/add-email-assertions
| |
| | Add email assertions trait
| |
| * commit 43178fd55d7ef9a42706279fa275bb783063cf34
| | Author: Jad Bitar <jadbitar@mac.com>
| | Date: Mon Aug 29 17:43:29 2016 -0400
| |
| | Fix `@since` in new files docblocks
| |
正如您所看到的,只有8314c2ff833280bbc7102cb6d4fcf62240cd3ac4和c3f45e811e4b49fe27624b57c3eb8f4721a4323b在提交行中将*作为第一个字符。这些提交来自主分支,而其他四个提交来自其他分支。
在这里,我根据Richard Hansen的回答(和Ben C的建议)给出了一个别名,但我对其进行了调整,以排除标签。别名应该相当健壮。
# For Git 1.22+
git config --global alias.only '!b=${1:-$(git branch --show-current)}; git log --oneline --graph "heads/$b" --not --exclude="$b" --branches --remotes #'
# For older Git:
git config --global alias.only '!b=${1:-$(git symbolic-ref -q --short HEAD)}; b=${b##heads/}; git log --oneline --graph "heads/$b" --not --exclude="$b" --branches --remotes #'
使用示例:
git only mybranch # Show commits that are in mybranch ONLY
git only # Show commits that are ONLY in current branch
注意,ONLY表示如果删除给定的分支(不包括标记的影响),提交将被丢失(在垃圾收集之后)。即使有一个名为mybranch的标记(多亏了前缀heads/),别名也应该工作。还要注意,根据ONLY的定义,如果提交是任何远程分支(包括上游分支)的一部分,则不会显示提交。
别名将单行历史记录显示为所选提交的图形。
a --- b --- c --- master
\ \
\ d
\ \
e --- f --- g --- mybranch (HEAD)
\
h --- origin/other
对于上面的例子,git只会显示:
* (mybranch,HEAD)
* g
|\
| * d
* f
为了包含标签(但仍然不包括HEAD),别名变成(针对旧Git进行如上调整):
git config --global alias.only '!b=${1:-$(git branch --show-current)}; git log --oneline --graph --all --not --exclude="refs/heads/$b" --exclude=HEAD --all #'
或者包含所有标签的变体,包括HEAD(并默认删除当前分支,因为它不会输出任何东西):
git config --global alias.only '!git log --oneline --graph --all --not --exclude=\"refs/heads/$1\" --all #'
最后一个版本是唯一真正满足commit -that-are-lost-if-given-branch-is-deleted标准的版本,因为如果签出分支就不能删除分支,HEAD或任何其他标记指出的提交都不会丢失。然而,前两个变体更有用。
最后,别名不能用于远程分支(例如。Git只有origin/master)。别名必须修改,例如:
git config --global alias.remote-only '!git log --oneline --graph "$1" --not --exclude="$1" --remotes --branches #'