有没有办法检查哪个是分支中的最后一个提交,而另一个分支中存在?



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

git branch -r --contains HEAD~X

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

请注意,如果只有一条从featuremaster的简单线性路径,那么您对 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列出Ggit log然后F然后停止。

或:

A--B--C--D   <-- master

   F--G   <-- feature1
 /    
E      J--K  <-- feature3
    /
H--I   <-- feature2

在这里,提交B由所有分支共享;提交E在除master之外的所有分支上;FGfeature1feature3共享;HIfeature2feature3共享;JKfeature3独有的。

使用master..feature3,您将枚举提交EK,但具体来说,FI顺序是可变的。 (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根本不在图形上行走,它只是找到AB,然后像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中,则这将为您提供分支点。

最新更新