如何列出所有不包含唯一提交的git分支

时间:2017-03-01 20:27:06

标签: git

我找到了有关显示包含给定提交的所有分支的信息。但是,如何在我的遥控器上找到新创建的没有针对它们的提交的分支?

2 个答案:

答案 0 :(得分:0)

通过运行git branch --merged

,您可以看到没有未合并的所有分支

这应该可以实现你想要的。没有提交的新创建的分支与已合并的旧分支没有什么不同。

答案 1 :(得分:0)

我不清楚这个问题意味着什么。

这是一个简单的例子。假设我们绘制了这个图:

...--o--o--o--o   <-- master
         \
          o--X    <-- br1, br2

master指向其提示。分支br1br2都指向他们自己的提示提交,但两个提交都是提交X。从这个意义上讲,这些分支名称中至少有一个是多余的。

现在,你说:

  

我的遥控器上新创建的分支

很容易找到远程跟踪分支名称:它们是refs/remotes/命名空间中的名称。名为origin的远程名称位于refs/remotes/origin/

&#34;然而,新创建的#34;在Git中没有意义。可以随时创建或销毁分支名称,指向任何提交。鉴于到目前为止绘制的图形,我们可以在br3之前添加指向提交的新X。如果我们在origin上执行此操作,然后运行git fetch,我们会:

...--o--o--o--o   <-- master
         \
          o       <-- origin/br3
           \
            X     <-- br1, br2

这与提交图相同;我只是将X向下移动到一个新行,以便我有足够的空间来填充名称origin/br3

在某种意义上,该名称 - origin/br3 - 对我们自己的br1br2名称都是多余的,因为它不会用于保留我们不会保留的任何提交。但它的与我们拥有的任何名称不同。

git branch选项--contains--merged--no-merged(现在git for-each-ref中也可用,因为Git 2.7.0)仅仅是对于&#34;的集体测试是或者不是祖先&#34;,在准确测试什么的其他方面有一些变化。回到此图表但添加更多名称:

...--U--V--Y--Z   <-- master
         \
          W--X    <-- br1, br2

图表告诉我们U是所有其他标记提交的祖先,YZ的祖先,WX的祖先}, 等等。 W Y的祖先,但是,由于提交节点仅链接&#34;向后&#34; -leftwards,在这些图形图中 - 所以{{1 }}返回WV返回Y,但V根本不连接到Y

对于这些&#34;是一个祖先&#34;测试,提交始终被视为自身的祖先。 (也就是说,这些是小于或等于,≤,测试,而不是严格 - 小于。)

运行W提交意味着:对于每个分支名称,查找其提示提交。 (那是git branch --contains <id>Z,然后是X。)然后,查看命名提交X是否是提示的祖先。如果是,请打印分支名称。因此,如果我们命名commit <id>,我们将获得所有分支名称,但如果我们将提交命名为U,则我们只获得Xbr1

运行br2表示:对于每个分支名称,请查找其提示提交。 (git branch --merged [<commit>]ZX再次。)然后,查看提示提交是否是我们刚刚命名的提交的祖先,如果我们没有,则查看X的祖先一个名字。如果是,请打印该分支名称。因此,如果我们现在正在提交HEAD,我们会看到Xbr1。但是,如果我们将提交命名为br2,则会得到 no 分支名称,因为UZ不是X的祖先。

运行U表示:对于每个分支名称,请查找其提示提交。然后,查看提示提交是否是我们刚刚命名的提交或git branch --no-merged [<commit>]的祖先。如果,请打印分支名称。

同样,这些都很简单&#34;是一个祖先&#34;测试,HEAD只为所有分支名称运行它们。 git branch--contains--merged控件:

  • 哪个提交哈希值在≤祖先测试的左右两侧;和
  • 是否&#34;是&#34;或&#34;不&#34; result打印分支名称。

(没有--no-merged测试将参数hash-ID放在左侧,但只有在测试说&#34; no&#34;时打印。为此,你必须拼写手动退出循环。)