查看分支开头的所有提交(仅查看当前分支)

时间:2014-05-21 14:36:03

标签: git

从现在到我们创建这个分支的那一刻,存在一种“git log”所有当前分支的提交方式?一种“$ git log --current-branch ......”

* b137094 Alter this stuff
* b2046b6 Change that stuff
* e6fd3b8 Hello world
* 31f3922 Lol
* d44552a ROTFL
*   7050d07 Hey you the rock steady crew
|\ 
| *   d8a9fcf Queens
| |\
* | | c1d6a37 Bluvertigo
* | | 83a7565 Luciano Ligabue
* | |   cfe48b0 Vasco Rossi
|\ \ \
. . . .
. . . .

观看此图表,我的意思是与

相同的结果
$ git log --oneline --graph 7050d07..HEAD

1 个答案:

答案 0 :(得分:2)

(请注意,git log 7050d07..HEAD“表示”git log HEAD ^7050d07,前缀^就像短期--not。这可能没有意义;请参阅下文,研究gitrevisionsgit rev-list的文档。这是理解下面两个git别名的关键。)

Git没有“创建分支时”的概念。分支名称只是一个移动的标签;更具体地说,本地分支是在该分支上添加新提交时自动移动的名称。所以你无法得到你所要求的,但你可能得到你想要的东西。

Git确实有我称之为“分支结构”的东西:提交图的一部分。它看起来像你想要的是git log,当分支结构有一个分支时停止,即在第一个具有两个父项的提交之前停止。但目前尚不清楚这是否真的 你想要什么。例如,请考虑以下图表:

               *
              / \
... o--o--*--*   *--*   <-- br1
        \     \ /
         \     *
          \
           o--o   <-- br2

其中br1br2是实际的分支标签。分支br1中有一个fork-and-join,您可能希望git log显示所有(但仅限于)* - ed提交。另一方面,也许您只想要单端*提交。

我有一个别名,使用分支标签和git for-each-ref

执行前者
[alias]
    ltf = !git log HEAD --not $(git for-each-ref \
            --format='%(refname:short)' refs/heads/ | \
            grep -v "^$(git symbolic-ref -q --short HEAD)$") --not

(第二个--not通常是不必要的:它会反转第一个--not的效果,这样,例如,tag-name参数可以添加更多提交,而不是减去提交。名字ltf来自我所拥有的一个模糊的想法,并且不是很有意义,但它仍然存在于我的~/.gitconfig ...)

这里的想法是使用for-each-ref生成所有本地分支名称(以简短形式),如果我们在一个(grep -v上,名称来自{{1},则丢弃当前分支}),并使用这些分支名称排除其他分支上的任何提交。

(任何其他参数都像往常一样添加到别名中,因此git symbolic-ref可以在这里工作。)

如果你确实想要从第一次合并(两次或多次父级)提交和向后工作中排除所有提交,那么这里使用git ltf --oneline --graphgit rev-list或{{ 1}}(这些是相同的选择器)来定位它:

--merges

这是提供--min-parents=2(或前缀git rev-list --merges -1 HEAD 的提交ID,但是如果没有这样的转换,则会出错,所以--not在这里更优秀:

^

(同样,第二个--not会反转第一个[alias] ltm = !git log HEAD --not $(git rev-list --merges -1 HEAD) --not 的效果,就像上面的--not别名一样。)因此,使用此别名,--not会产生:

ltf

(由于没有货叉,因此git ltm --graph --oneline保证无聊。)