我想知道我当前所在的分支是从哪个分支派生出来的。我已经查看了日志,但是太多噪音,我希望能够百分之百确定在这种情况下找到正确的分支。
我想知道我当前所在的分支是从哪个分支派生出来的。我已经查看了日志,但是太多噪音,我希望能够百分之百确定在这种情况下找到正确的分支。
git reflog <branch>
来获取此分支在您的 repo 中的第一个出现:$ git reflog branch | tail -n 1
03302d2 branch@{12}: branch: Created from HEAD
03302d2
是该分支的第一个提交。
然后,您可以查找该提交的父级来自哪些分支。
例如,您可以执行以下操作$ git branch --contains 03302d2^
请参考链接的问题以了解更高级的方法。但请注意,此搜索并不完整,您可能会错过“正确”的分支。
在您的本地代码库当前的目录/路径中,输入以下命令:
git log --oneline --decorate --graph
(代码库 https://github.com/spring-projects/spring-boot.git 的分支结构)
你将看到你的分支路径。
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-a
和 branch-b
两个分支上都存在,因此可能是从任意一个分支创建的。
Git 中的分支是指向提交的简单指针。分支所指向的提交的所有祖先都属于该分支,例如:
a -- b -- c -- d <master
\
d -- e <foo
a
,b
是 master
和 foo
的一部分,而b
,c
,d
是 master
的一部分。但是分支只是指针的名称。我们可以为 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。
--fork-point
使用了 reflog,因此该方法也不能保证完全准确。最简单的方法可能是在 reflog 中搜索“created from”消息。如果该条目已过期,但 --fork-point
找到了某些内容,则该“某些内容”可能仍然有用。当然,您还可以使用当前合并基线作为提示(实际上,如果 reflog 条目已过期,--fork-point
就会回退到这个选项)。 - torek添加另一种方式。您还可以使用带有-v
的git分支。
git branch -v
这将在第二列中列出源提交。