查看我的当前分支是从哪个分支派生出来的命令是什么?

4

我想知道我当前所在的分支是从哪个分支派生出来的。我已经查看了日志,但是太多噪音,我希望能够百分之百确定在这种情况下找到正确的分支。


Martin Nyolt的答案是可行的解决方案。未来要考虑的一个好习惯是用连字符从派生分支(即 development-newFeature)命名您的分支。或者,您可以选择始终从一个分支进行分支(即开发人员始终从主分支分支,特性始终从开发人员分支分支)。但最终,这取决于您决定采用的工作流程。 - nullverb
4个回答

5
这个问题不能一概而论。 分支不是固定的: 你可以自由地移动它们。 reflog 可以让你看到该分支的 部分 历史,但 reflog 仅在本地,并且默认只保存 90 天。
你可以使用 git reflog <branch> 来获取此分支在您的 repo 中的第一个出现:
$ git reflog branch | tail -n 1
03302d2 branch@{12}: branch: Created from HEAD

在这个例子中,03302d2是该分支的第一个提交。 然后,您可以查找该提交的父级来自哪些分支。 例如,您可以执行以下操作
$ git branch --contains 03302d2^

请参考链接的问题以了解更高级的方法。但请注意,此搜索并不完整,您可能会错过“正确”的分支。


3

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 需要一个分支名称来进行检查。因此,你可以很容易地询问 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 是从哪个分支创建的? 标记为 X 的提交在 branch-abranch-b 两个分支上都存在,因此可能是从任意一个分支创建的。

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 中,唯一可以被保留的是作为 SHA-1 的 fork-point,由于分支可变性的特性。然而,您可以依靠 git merge-base --fork-point 返回实际 fork-point 的 SHA1。


1
由于 --fork-point 使用了 reflog,因此该方法也不能保证完全准确。最简单的方法可能是在 reflog 中搜索“created from”消息。如果该条目已过期,但 --fork-point 找到了某些内容,则该“某些内容”可能仍然有用。当然,您还可以使用当前合并基线作为提示(实际上,如果 reflog 条目已过期,--fork-point 就会回退到这个选项)。 - torek

0

添加另一种方式。您还可以使用带有-v的git分支。

git branch -v

这将在第二列中列出源提交。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接