有什么方法可以检查另一个分支中存在的最后一个提交吗?

时间:2018-11-29 17:37:21

标签: git

我有两个分支: master feature 。我想检查 feature 分支是从哪个提交创建的。为此,我必须单独检查每个提交

git branch -r --contains HEAD~X

仅当我达到所需的提交时才返回两个分支。有没有更简单的方法来检查这一点?谢谢!

2 个答案:

答案 0 :(得分:0)

使用git merge-basehttps://git-scm.com/docs/git-merge-base)。

git merge-base master feature将给您第一个共同祖先。如果自从最初创建master分支以来尚未将feature合并到feature中,那么这将为您提供分支点。

答案 1 :(得分:0)

请注意,如果只有一条从feature回到master的线性路径,那么您可以接受Git - how to find first commit of specific branch的答案:

A--B--C--D   <-- master
    \
     E--F--G   <-- feature

这里git log --oneline master..feature将列出提交G,然后依次列出FE,因此最后的输出行将是提交E的行。 (如果只需要哈希ID,请使用git rev-list master..feature | tail -1。)

但是请考虑:

A--B--C--D   <-- master
    \
     E   <-- develop
      \
       F--G   <-- feature

此处master..feature仍列出提交E,即使您想提交F:您也需要develop..feature来拥有git log列表G,然后F,然后停止。

或者:

A--B--C--D   <-- master
    \
     \   F--G   <-- feature1
      \ /    \
       E      J--K  <-- feature3
        \    /
         H--I   <-- feature2

在这里,提交B由所有分支共享; Emaster以外的所有分支上; FG共享feature1feature3HI共享feature2feature3JKfeature3除外。

使用master..feature3,您将列举EK的提交,但具体是F到{{1 }}是可变的。 ({I将在所有四个之后出现,E在列出F之前不会被提及,G在列出H之前不会被提及,但是您仍然可以使用很多排序。)您可以使用各种排序控件在限制范围内选择订单;默认情况下,此时I可能有多个可能提交的提交时,按提交者日期进行操作。

通常,Git的工作方式是从这些分支名称之一指向的 tip 提交开始,然后反向进行。当到达有连接的地方(例如合并提交git log)时,Git同时开始沿两个路径走。使用J,它会根据您选择的排序顺序以某种顺序打印这些提交。 (最终,路径通常会重新收敛,在这种情况下,路径会在提交git log时进行。此时,E可以一次继续执行一次提交。)

只要提交存在,提交本身就一直固定在适当的位置(您可以以不同的方式绘制图形,但是git log的父级始终是E),但是<指向特定提交的分支名称em> names 都是可移动的:任何名称都可以随时移动以指向任何一个特定的提交。请注意,可以随时添加或删除名称:如果删除所有允许您查找提交的名称,则很难收回该提交。 1 < / sup>通常,Git命令和Git范围列表(如B等),将名称解析为提交,然后使用提交图完成其工作。 2


1 如果A..B在错误的时间运行,并且您已禁用reflogs或reflog条目太旧且过时,则 Grim 垃圾收集器可以抛出任何无法到达的提交。到那时,提交已经真的消失了,甚至知道它的哈希ID也无法为您节省。

2 这里的主要例外是git gc:如果给git diff一个范围,它只会将其视为您给了它两个不同的提交哈希ID。也就是说,git diff根本不会遍历图,它只是找到git diff A..BA,然后像B一样工作。 git diff A B命令还对三点语法git diff进行了特殊处理。

A...B还以其git rebase语法获得了A...B(带有三个点)的特殊情况。