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

时间:2016-09-30 14:12:44

标签: git git-branch git-log

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

4 个答案:

答案 0 :(得分:4)

在每种情况下都无法回答这个问题。 分支不是持久的:你可以随意移动分支。 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^

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

答案 1 :(得分:2)

以下内容即将结束,但请参阅限制

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需要检查分支名称。所以你可以很容易地问一下主人和我现在的分支之间的分叉点。

因为我们要检查我们使用的所有分支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来自哪个分支?在两个分支Xbranch-a上标记为branch-b i的提交。所以它可能来自其中任何一个。

Git中的分支

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

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

abmasterfoo的一部分,而bcd是其中的一部分master。但是分支只是指针的名称。我们可以为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。

答案 2 :(得分:1)

在本地存储库的当前目录/路径中,键入命令:

git log --oneline --decorate --graph

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

您将看到分支的路径。

答案 3 :(得分:0)

添加替代方式。您还可以将git branch与-v

一起使用
git branch -v

将列出第二列中的原始提交。