主分支缺少哪些提交?

3
我可以通过以下方式检查特定提交已合并到哪些分支中:
```git git branch --contains ```
git branch --contains 469bcec

有没有办法获取哪些提交没有进入特定分支?

例如,有没有办法检查哪些提交尚未进入Master分支?

谢谢


获取某个提交所不存在的所有分支: diff <(git branch) <(git branch --contains eb87aa6c)。这不完全是您要找的,但可以作为解决方案的一部分。 - Eric Tjossem
4个回答

3
这至少与您想要的接近 - 不确定是否完全相匹配:
git log --pretty=oneline --all --not master

1
无法指定“存储库中所有提交(不考虑标签)”,但内部有一种方法可以找到“悬空提交”(这就是git fsck的工作原理),但您不希望这样做,因为它会找到“临时,非分支”的提交,例如在refs/stash及其reflog中的提交。

不清楚您是否希望包含或排除通过refs/remotes/命名的提交,例如(“远程分支”),还是那些通过标签命名的提交。然而,总体上,做法是以talles' answer为起点,该答案使用了..语法:EXC..INCINC --not EXC意思相同,即从“包含”点INC开始可达的所有提交,减去从“排除”点EXC开始的所有提交。如果devel是包含点,master是排除点,则这是一个列出的提交“在devel上”,但不是“在master上”。 (您可以省略任一侧以表示“使用HEAD”,因此..master表示“包含HEAD,排除master”,这意味着“在此分支上的所有提交都不在master上”)。

使用扩展形式,可以请求从多个起始“包含”点可达的所有提交,减去从“排除”点可达的提交。因此:
git log featureA featureB --not master

这将获取两个特性分支上不在master中的所有内容。

如果您想要“本地分支”,则有一种直接的方法:git rev-list有一个--branches参数。使用--branches表示“所有本地分支”。您可以添加=pattern以仅选择与某些shell样式模式匹配的分支,例如--branches='feature*'以选择分支featureAfeatureB等,但不包括分支devel

将它们提供给任何使用git rev-list的命令,包括git log

$ git log --oneline --graph --decorate --branches --not master

有类似于标签和远程的git rev-list参数,以及--glob,它允许您访问完整的引用名称空间。提供--all(如twalberg's answer中所示)意味着与--glob=*相同,即包括refs名称空间中的每个引用,其中包括refs/stash,这不总是您想要的。
(还有一个最后的句法技巧:您可以用^master来拼写--not master。这与使用--not略有不同:--not翻转适用于所有后续名称的布尔标志,而前导的^仅适用于其一个项目;因此,--not rel1 rel2“意味着”与^rel1 ^rel2相同。请注意,^commitcommit^非常不同。啊,Git。 :-) )

真是个深奥的答案。 - talles

0

我不确定你能否在一个命令中对所有分支进行操作(无需编写脚本),但是对于特定的分支,你可以这样做:

git log master..mybranch

这将列出在mybranch上存在但不在master上的所有修订。

您还可以在同一命令中使用多个分支:

git log master..mybranch1 master..mybranch2

为了简单起见,您还可以添加--oneline选项,并省略当前所在的分支(假设您当前位于主分支):

git log ..mybranch1 ..mybranch2 --oneline

0

另一种方法:Git 1.9/2.0(2014年第一季度)将包括一个新的--exclude选项,其中包含commit 10167eb

人们经常希望有一种方法告诉“git log --branches”(和“git log --remotes --not --branches”)从“--branches”扩展中排除一些本地分支(类似于“--tags”,“--all”和“--glob=<pattern>”)。
现在他们有了这个选项。

git rev-parsegit rev-list现在提到:

--exclude=<glob-pattern>::

不要包括与下一个--all、--branches、--tags、--remotes或--glob将考虑的匹配的引用。此选项的重复会累积排除模式,直到下一个--all、--branches、--tags、--remotes或--glob选项(其他选项或参数不清除已累积的模式)。
应用于--branches、--tags或--remotes时,给定的模式不应以refs/heads、refs/tags或refs/remotes开头,而应以refs/开头,应用于--glob或--all时必须以refs/开头。如果想要一个尾随的“/{asterisk}”,必须明确给出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接