使用什么命令查看我的实际分支派生自哪个分支?

What command to use to see what branch my actual branch derived from?

我想看看我所在的实际分支来自哪个分支。我已经查看了日志,但它太吵了,我想 100% 确定在这种情况下找到正确的分支。

这个问题不可能在所有情况下都有答案。 分支不是持久的:您可以自由移动分支。 reflog 将允许您查看分支的一些 历史记录,但 reflog 仅在本地并且限制为 90 天(默认情况下)。

您可以使用 git reflog <branch> 获取此分支在您的存储库中的第一次出现:

$ git reflog branch | tail -n 1
03302d2 branch@{12}: branch: Created from HEAD

在此示例中,03302d2 是该分支的第一个提交。 然后,你可以find the branches that the parent of this commit came from。 例如,你可以做

$ git branch --contains 03302d2^

有关更复杂的方法,请参阅链接的问题。但请再次注意,此搜索尚未完成,您可能会错过 "correct" 分支。

添加替代方法。您还可以将 git 分支与 -v

一起使用
git branch -v

这将在第二列中列出原始提交。

以下内容接近,但请参阅限制

git branch --contains $(
   git for-each-ref --format='%(refname)' refs/heads/ |
     xargs git merge-base --fork-point)

想法

我们正在使用 git merge-base --fork-point 获取一个分叉点作为 SHA-1。 merge-base 需要一个分支名称来检查。所以你可以很容易地问 master 和我当前分支之间的分叉点是什么。

因为我们要检查我们正在使用的所有分支 git for-each-ref --format='%(refname)' refs/heads/。然后我们得到一个 SHA-1。为了获得分支名称,我们使用 git branch --contains

限制

这方面有很多限制。它只是让您很好地猜测存储库来自哪个分支,但是对于 git 来说很难确定某些东西来自哪个分支。举个例子

       o -- o
      /     ^ branch-a
o -- X -- o -- o
     \         ^ branch-b
      o -- o -- o
                ^ branch-c

branch-c来自哪个分支?在两个分支 branch-abranch-b 上标记为 X i 的提交。所以它可能来自他们中的任何一个。

Git

中的分支机构

Git 中的分支是指向提交的简单指针。分支指向的提交的每个祖先都是分支的一部分:例如:

a -- b -- c -- d <master
     \
      d -- e <foo

abmasterfoo 的一部分,而 bcdmaster 的一部分。然而,分支只是指针的名称。我们可以将新名称设置为 d.

a -- b -- c -- d <master
      \        ^bar
      d -- e <foo

现在 master 上的所有内容也在 bar 上。分支没有版本化,所以我们无法回答分支在某个时间点指向哪里的问题。因此,我们无法清楚地确定 foo 是从哪里分支出来的。 Git 提供了一个 reflog 来跟踪分支移动,但会随着时间的推移而过期。

结论

在 git 中唯一要说的是 fork-point 作为 sha-1,因为分支的性质是可变的。但是,您可以依靠 git merge-base --fork-point 返回一个 SHA1,它是实际的分叉点。

在您本地存储库的当前 directory/path,键入命令:

git log --oneline --decorate --graph

(存储库的分支结构https://github.com/spring-projects/spring-boot.git

您将看到分支的路径。