我有两个分支: master 和 feature 。我想检查 feature 分支是从哪个提交创建的。为此,我必须单独检查每个提交
git branch -r --contains HEAD~X
仅当我达到所需的提交时才返回两个分支。有没有更简单的方法来检查这一点?谢谢!
答案 0 :(得分:0)
使用git merge-base
(https://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
,然后依次列出F
和E
,因此最后的输出行将是提交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
由所有分支共享; E
在master
以外的所有分支上; F
和G
共享feature1
和feature3
; H
和I
共享feature2
和feature3
; J
和K
和feature3
除外。
使用master..feature3
,您将列举E
到K
的提交,但具体是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..B
和A
,然后像B
一样工作。 git diff A B
命令还对三点语法git diff
进行了特殊处理。
A...B
还以其git rebase
语法获得了A...B
(带有三个点)的特殊情况。