>我有两个分支:master和feature。我想检查功能分支是从哪个提交创建的。为此,我必须单独检查每个提交
git branch -r --contains HEAD~X
它仅在我达到所需的提交时返回两个分支。有没有更简单的方法来检查这一点?谢谢!
请注意,如果只有一条从feature
到master
的简单线性路径,那么您对 Git 的公认答案很好 - 如何找到特定分支的第一次提交:
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
列出G
git log
然后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
到I
的顺序是可变的。 (E
将在所有四个之后出现,F
在列出G
之前不会提及,H
也不会在列出I
之前提及,但这仍然留下了很多可能的排序。 您可以使用各种排序控件在限制范围内选择顺序;默认值是按提交者日期,此时有多个可能的提交供git log
发出。
通常,Git 的工作原理是从提示提交开始,如这些分支名称之一所指向的那样,然后向后工作。 当到达有连接的地方(如合并提交J
)时,Git 开始同时走两条路。 使用git log
,它会根据您选择的排序顺序以某种顺序打印这些提交。 (最终路径通常会重新收敛,就像在本例中它们在提交E
所做的那样。 此时,git log
可以一次恢复执行一次提交。
只要提交本身存在,它们就会固定在原地——你可以以不同的方式绘制图形,但E
的父级总是B
,例如——但名称,指向特定提交的分支名称,都是可移动的:任何名称都可以随时移动以指向任何一个特定的提交。 可以随时添加或删除名称,但有一个警告:如果您删除所有允许您找到提交的名称,则很难恢复该提交。1通常,Git 命令和 Git 范围列表(如A..B
等)将名称解析为提交,然后使用提交图来完成其工作。阿拉伯数字
1如果git gc
在错误的时间运行,并且您禁用了 reflogs 或 reflog 条目太旧和过时,则Grim垃圾回收器可能会抛出任何无法访问的提交。 此时,提交真的消失了,即使知道它的哈希 ID 也无法拯救你。
2这里的主要例外是git diff
:如果你给git diff
一个范围,它只是把它当作你给了它两个不同的提交哈希 ID。 也就是说,git diff A..B
根本不在图形上行走,它只是找到A
并B
,然后像git diff A B
一样行事。git diff
命令还对三点语法进行了特殊处理,A...B
。
git rebase
还在其--onto
语法中获得了A...B
(带有三个点)的特殊情况。
研究使用git merge-base
(https://git-scm.com/docs/git-merge-base)。
git merge-base master feature
会给你第一个共同的祖先。如果自最初创建feature
分支以来尚未将master
合并到feature
中,则这将为您提供分支点。