在Git中,如何找出创建当前分支的分支?

14

我正在参与一个由大型团队共同合作的项目。随着时间的推移,人们一直在创建分支并将它们推送到远程存储库。

如何知道是哪个分支是另一个人创建的新分支的根分支?新分支可以基于当前HEAD创建,但也可以指定 <start-point> ,它可以是提交、标签或分支。我怎样才能找出是哪个分支用于创建新分支?

额外的问题:提交可以随着分支创建一起推送。我想使用服务器上的post-receive hook记录与新分支相关的这些提交。钩子传递了 (oldrev, newrev, refname) ,如果我能找到上面那个问题的答案就好了。


分支是指针,不断地移动到不同的提交。因此,当您想要检查它时,用于创建分支的原始指针可能已经移动了很多,使得无法获取其名称。 - poke
1
可能是分支长度:Git中分支从哪里开始?的重复问题。 - user456814
你可以在任何地方创建一个分支。它不必从另一个分支开始。它可以从任意提交开始,包括空提交(即第一个提交的父提交)。 - Dietrich Epp
2
你可能会对Git列表上的这篇最新帖子感兴趣(http://thread.gmane.org/gmane.comp.version-control.git/229422) -- 它展示了Git开发者在这个问题上的立场,基本上可以总结为“如果你需要在提交对象中获取分支信息,那么你还没有掌握Git的思维模型”。(请注意,这不一定代表我的个人观点。) - kostix
谢谢@kostix。你提供的链接解决了我的疑惑。 - Eric Wang
3个回答

2
如果所有分支都是从主分支创建的,你可以这样做:

如果所有的分支都是从主分支创建的,你可以:

git merge-base master ${branch_in_question}

只有在创建分支后未进行合并操作才能使用此方法。对于Git而言,这通常不是一个非常容易回答的问题。与svn log --stop-on-copy不同。我并不是说我更喜欢Subversion。


是的,但主分支只是默认分支。可以从任何现有分支创建一个新分支,因为分支本质上就是一个提交,所以可以从任何现有提交创建分支。我的问题是:我如何知道服务器端使用了哪个提交?尤其是当用户在创建分支时还推送了新的提交。 - Eric Wang
是的,我知道这就是为什么我说“如果所有分支都是从主分支创建的”。对于git来说,这个问题确实不容易回答。 - cforbish

1

您可以通过多种方式找到一组分支的公共祖先提交。在问题Git中分支长度:分支从哪里开始?中有几个答案。

其中一个答案(也是我的答案)是使用show-branch命令,将要比较并查找公共祖先提交的分支列表作为参数传递给该命令。以下是来自Linux内核Git文档的show-branch示例

$ git show-branch master fixes mhf
* [master] Add 'git show-branch'.
 ! [fixes] Introduce "reset type" flag to "git reset"
  ! [mhf] Allow "+remote:local" refspec to cause --force when fetching.
---
  + [mhf] Allow "+remote:local" refspec to cause --force when fetching.
  + [mhf~1] Use git-octopus when pulling more than one heads.
 +  [fixes] Introduce "reset type" flag to "git reset"
  + [mhf~2] "git fetch --force".
  + [mhf~3] Use .git/remote/origin, not .git/branches/origin.
  + [mhf~4] Make "git pull" and "git fetch" default to origin
  + [mhf~5] Infamous 'octopus merge'
  + [mhf~6] Retire git-parse-remote.
  + [mhf~7] Multi-head fetch.
  + [mhf~8] Start adding the $GIT_DIR/remotes/ support.
*++ [master] Add 'git show-branch'.

在这个例子中,master 被与 fixesmhf 分支进行比较。将输出视为一个表格,每个分支都有自己的一列,每个提交都有自己的一行。包含提交的分支将在其列中的该提交所在行中显示 +-
在输出的最底部,您会看到所有3个分支共享一个公共祖先提交,并且实际上它是 masterhead 提交。
*++ [master] Add 'git show-branch'.

这意味着fixesmhf都是从master中的该提交分支出来的。

0
如何知道另一个人创建的新分支的根分支是哪个?
虽然git show-branch可能很有用,但它可能会在Git 2.12或更低版本中失败。 即将推出的Git 2.13(2017年第二季度)将增加git show-branch的健壮性。

请查看提交 d3cc5f4(2017年2月15日),以及提交 d9e557a提交 e6a7c75(2017年2月14日),作者为Jeff King (peff)
协助者:Pranit Bauva (pranitbauva1997)
(由Junio C Hamano -- gitster --提交 74a7727中合并,日期为2017年2月27日)

"git show-branch" 预期仓库中只有非常短的分支名称,并使用固定长度缓冲区来保存它们,而不检查溢出。

show-branch:在堆缓冲区中存储已解析的 HEAD

我们解析 HEAD 并将结果复制到固定大小的缓冲区中,使用 memcpy,从未检查它是否适合。
此错误可以追溯到 8098a17(添加 git-symbolic-ref,2005-09-30,Git 0.99.8a)。
在那之前,我们使用了 readlink(),它采用了最大缓冲区大小。

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