我如何使用 JGit 找到分支的第一次提交?

How can I find the first commit of a branch with JGit?

我想使用 Eclipse 的 JGit 库找到特定分支的第一个提交。例如,如果我有

master -- a -- c -- d -- e
          \
  feature  b -- f -- g -- h
            \
    another  j -- k -- l

// findBranchRoot() is the magic method we want to create
repository.resolve("feature").findBranchRoot().getId(); // this would return b
repository.resolve("another").findBranchRoot().getId(); // this would return j

有人知道怎么做吗?

如果first commit表示分支的最recent/youngest次提交,可以使用Repository::resolve返回的ObjectId获取RevCommit(JGit 对提交对象的表示)带有 RevWalk:

ObjectId commitId = repository.resolve("refs/heads/feature");
try(RevWalk revWalk = new RevWalk(repository)) {
  RevCommit commit = revWalk.parseCommit(commitId);
}

我建议将完全限定的 ref 传递给 resolve(如示例中所示)。否则,您可能会得到 AmbiguousObjectException 或方法 returns 具有相同短名称的注释或标签。

您将遇到的问题是——请耐心等待,在这里——提交不是 "on" 分支。要看到这一点,请考虑您绘制的图表。这是模棱两可的。难免如此。你画了

A---C---D---E          master
 \
  B---F---G---H        feature
   \
    J---k---L          another

而且根本无法确定 B 是 "on" feature 还是 another(或者,就此而言,三个 A 是 "on").

A---C---D---E          master
 \
  B---J---K---L        another
   \
    F---G---H          feature

显示完全相同的历史记录。这完全取决于您选择如何解释它。

如果你想将提交绑定到一些外部管理记录,在提交消息中放置一个标记,就可以了,但在 Git 本身(以及实际工作)中它是历史重要的是结构,而不是在这个 repo 或那个中如何引用它的位。

如果到了发布 featureanother 的时候,您将需要以任何一种方式推送提交 B,除非它已经作为其他一些内容的一部分被推送工作。血统很重要。分支名称没有。