以下shell命令应该执行您想要的操作:
git log --all --not $(git rev-list --no-walk --exclude=refs/heads/mybranch --all)
注意事项
如果您已mybranch签出,则上述命令将不起作用。那是因为提交的提交mybranch也可以通过进行访问HEAD,因此Git认为提交不是唯一的mybranch。为了使它在mybranch检出时正常工作,还必须为添加一个排除项HEAD:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD \
--all)
但是,除非已将检出,否则您不应该排除它,否则,您可能会冒出不是专有的提交的风险。HEADmybranchmybranch
同样,如果您有一个origin/mybranch与本地mybranch分支相对应的远程分支,则必须将其排除在外:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--all)
而且,如果remote分支是远程存储库的默认分支(通常仅适用于origin/master),则还必须排除origin/HEAD:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--exclude=refs/remotes/origin/HEAD \
--all)
如果您已将分支签出,并且有一个远程分支,并且该远程分支是远程存储库的默认分支,那么您最终会排除很多:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD
--exclude=refs/remotes/origin/mybranch \
--exclude=refs/remotes/origin/HEAD \
--all)
说明
该git rev-list命令是低级(管道)命令,用于遍历给定的修订并转储遇到的SHA1标识符。认为它等同于git log它只显示SHA1,没有日志消息,没有作者姓名,没有时间戳,也没有“花哨”的东西。
--no-walk顾名思义,该选项可防止git rev-list沿袭祖先链。因此,如果键入git rev-list --no-walk mybranch,它将仅打印一个SHA1标识符:mybranch分支的尖端提交的标识符。
该--exclude=refs/heads/mybranch --all参数告诉git rev-list从除了每个参考启动refs/heads/mybranch。
因此,当您运行时git rev-list --no-walk --exclude=refs/heads/mybranch --all,Git将打印每个引用的尖端提交的SHA1标识符(除外)refs/heads/mybranch。这些提交和他们的祖先是您在提交不中,这些兴趣是你做的提交不希望看到的。
在其他的提交是你想看到的,所以我们收集的输出的东西git rev-list --no-walk --exclude=refs/heads/mybranch --all,并让Git显示一切,但这些提交和他们的祖先。
的 --no-walk参数对于大型存储库是必需的(并且对于小型存储库是一种优化):如果没有该参数,则Git将不得不打印,并且Shell将不得不收集(并存储在内存中)比必要数量更多的提交标识符。在大型存储库中,收集的提交数量很容易超过Shell的命令行参数限制。
git bug?
我本来期望以下工作:
git log --all --not --exclude=refs/heads/mybranch --all
但事实并非如此。我猜这是Git中的错误,但这也许是故意的。