13

我正在做一个项目,该项目也由一个大团队进行。随着时间的流逝,人们一直在创建分支并将它们推送到远程仓库。

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

一个额外的问题:提交可以与分支创建一起推送。我想通过在服务器上使用 post 接收挂钩来记录与新分支有关的提交。钩子通过(oldrev,newrev,refname)传递,如果我能找到上面问题的答案,那就太好了。

4

3 回答 3

1

有几种方法可以找到一组分支的共同祖先提交。分支长度的问题有几个答案:Git 中的分支从哪里开始?.

一个答案(这是我的一个)是使用该show-branch命令,将您想要比较的分支列表作为参数传入并为其找到共同的祖先提交。这是Linux Kernel 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正在与fixesandmhf分支进行比较。将此输出视为一个表,每个分支都有自己的列,每个提交都有自己的行。包含提交的分支将在该提交的行中的列中显示+或显示。-

在输出的最底部,您会看到所有 3 个分支共享一个共同的祖先提交,并且它实际上是以下head提交master

*++ [master] Add 'git show-branch'.

这意味着fixesmhf都从master.

于 2013-07-16T04:54:59.333 回答
1

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

git merge-base master ${branch_in_question}

这仅适用于自分支创建以来未进行任何合并的情况。在大多数情况下,这在 git 中并不是一个很容易回答的问题。不同于svn log --stop-on-copy. 并不是说我更喜欢颠覆。

于 2013-07-16T01:44:04.823 回答
0

我怎么知道哪个分支是另一个人创建的新分支的根?

虽然git show-branch可能很有用,但对于 Git 2.12 或更低版本可能会失败。
即将推出的 Git 2.13(2017 年第二季度)将增加 git show-branch 的健壮性。

请参阅Jeff King的提交d3cc5f4 ( 2017 年 2 月 15 日)和提交 d9e557a提交 e6a7c75(2017 年 2 月 14 日) ( 。 帮助者:Pranit Bauva ( )(由Junio C Hamano 合并 -- --提交 74a7727中,2017 年 2 月 27 日)peff
pranitbauva1997
gitster

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

show-branch:将解析的头部存储在堆缓冲区中

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

于 2017-03-26T11:19:38.833 回答