以下 shell 命令应该执行您想要的操作:
git log --all --not $(git rev-list --no-walk --exclude=refs/heads/mybranch --all)
注意事项
如果您已mybranch
签出,则上述命令将不起作用。那mybranch
是HEAD
因为mybranch
. 要在mybranch
签出时使其工作,您还必须添加排除HEAD
:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD \
--all)
但是,除非已签出,否则不应排除.HEAD
mybranch
mybranch
同样,如果您有一个名为origin/mybranch
与本地mybranch
分支相对应的远程分支,则必须将其排除:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--all)
如果远程分支是远程存储库的默认分支(通常仅适用于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 会打印除refs/heads/mybranch
. 这些提交及其祖先是您不感兴趣的提交——这些是您不想看到的提交。
其他提交是您想要查看的,因此我们收集输出并git rev-list --no-walk --exclude=refs/heads/mybranch --all
告诉 Git 显示除这些提交及其祖先之外的所有内容。
该--no-walk
参数对于大型存储库是必要的(并且是对小型存储库的优化):没有它,Git 将不得不打印,并且 shell 将不得不收集(并存储在内存中)比必要更多的提交标识符。对于大型存储库,收集的提交数量很容易超过 shell 的命令行参数限制。
吉特错误?
我本来希望以下工作:
git log --all --not --exclude=refs/heads/mybranch --all
但事实并非如此。我猜这是 Git 中的一个错误,但也许是故意的。