首页 > 解决方案 > 如何找到指定分支的父分支?

问题描述

给定一个指定的分支,我如何找到它是从哪个分支分支出来的?

我知道 Git 实际上并不支持大多数 SCM 所称的分支,所以这是一个很难回答的问题,或者在某些情况下甚至可能没有答案。尽管如此,我们的分支策略(GitFlow)是分支繁重的,因此我们通常需要检查存储库的“分支”结构。

鉴于我对 Git 对分支缺乏了解的了解,坦率地说,我很难知道如何用在 Git 中有意义的术语来表达这个问题。

我确实知道可以确定哪个分支“包含”另一个分支,git branch --contains <commit>因此可能一种类似于 Git 的方式来制定问题是,“我如何确定包含在至少一个其他分支中的分支的第一个祖先提交包含指定的分支?”

我不完全确定这是正确的问题,但这是我能做的最好的。

我正在寻找一种解决方案,该解决方案在面对从其父级同步合并到其自身或被合并回其父级的分支时是健壮的。

我还在寻找一种至少对用户友好的解决方案,最好是单个 Git 命令或 TortoiseGit gui 方法,而不是 BASH 或 Python 脚本。

标签: git

解决方案


1/3,tl;博士,假设 OP 没有遗漏任何重要的东西:

git log  develop..feature-x

2/3:如果我们做一些简化的假设,对于似乎真正的问题有一个简单的答案,我会解决的。

对于标题问题,“我如何找到父分支”,

我们的分支策略(GitFlow)

in body 让事情变得简单:两分钟的tfm对分支如何拆分和合并给出了简单、突出指定、明确的约束。对于master,没有父母。对于develop,父级是master。对于任何开始hotfix-,父母都是master。对于其他一切,父母都是develop.

OP 的观点充满了错误的前提,我只想绕过它们,我真诚地希望这是一个不和谐的俏皮话:让抽象的猴子像害怕的驴子一样骑着你,对猴子来说是极好的乐趣,希望对你来说不那么如此,而且对于附近有事要处理的任何人来说,情况要少得多,尽管这种奇观至少为任何有时间的人提供了一些娱乐。

但是,从评论来看,

在其父级旁边显示功能分支的日志,这将使我能够了解该功能是如何随着时间的推移而开发的,以及该功能何时从其父级合并更新

我认为OP试图解决的问题是什么。在 Git Flow 的情况下,每个功能分支都会分支出来develop,并在完成后合并回develop一次,然后将其删除。所以如果一个分支 let's callfeature-x没有被删除,答案是

git log  develop..feature-x

任何你想要的细节选项。如果它被删除,那么 (a) 它已被合并到develop中,在这种情况下您正在寻找

featurexmerge=`git rev-parse "develop^{/^Merge branch 'feature-x'}"`
git log featurexmerge^1..featurexmerge^2

(请参阅git rev-parse文档)因为 mergeback 的第一个父级是develop在合并时,它的第二个是feature-x; 或(b)它没有,分支在其原始存储库中被放弃,在这种情况下,唯一要做的就是在该存储库中的HEADreflog 中寻找在该分支上所做的提交并运行上述最新的那些.


3/3:……不。直到 OP 在这个 repo 中填写了很多关于真实情况的明显缺失的细节之前,没有第 3 部分。完全一般的情况,根本没有遵循任何纪律,历史是任意的,邪恶的混乱,周围没有人可以解释这个想法是什么,可以通过一些--first-parent取证来解决,这甚至不难,但是(a)ewww, (b) 这不是被问到的。


推荐阅读