使用什么命令查看我的实际分支派生自哪个分支?
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-a
和 branch-b
上标记为 X
i 的提交。所以它可能来自他们中的任何一个。
Git
中的分支机构
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 中唯一要说的是 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)
您将看到分支的路径。
我想看看我所在的实际分支来自哪个分支。我已经查看了日志,但它太吵了,我想 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-a
和 branch-b
上标记为 X
i 的提交。所以它可能来自他们中的任何一个。
Git
中的分支机构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 中唯一要说的是 fork-point 作为 sha-1,因为分支的性质是可变的。但是,您可以依靠 git merge-base --fork-point
返回一个 SHA1,它是实际的分叉点。
在您本地存储库的当前 directory/path,键入命令:
git log --oneline --decorate --graph
您将看到分支的路径。