找到用于在Git中创建当前分支的分支?

时间:2013-07-15 23:46:40

标签: git

我正在开展一个由大团队工作的项目。随着时间的推移,人们一直在创建分支并将它们推送到远程仓库。

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

奖励问题:提交可以与分支创建一起推送。我想通过在服务器上使用post receive hook来记录那些与新分支有关的提交。钩子传递给(oldrev,newrev,refname),如果我能找到上面问题的答案,那将会很好。

3 个答案:

答案 0 :(得分:1)

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

git merge-base master ${branch_in_question}

仅在创建分支后未进行合并时才有效。在大多数情况下,这不是一个很容易回答的问题。与svn log --stop-on-copy不同。不是说我更喜欢颠覆。

答案 1 :(得分:1)

有几种方法可以为一组分支找到共同的祖先提交。问题Branch length: where does a branch start in Git?中有几个答案。

One answer (it's one of mine)是使用show-branch命令,将要比较的分支列表作为参数传入,并找到共同的祖先提交。以下是the Linux Kernel Git documentation for 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个分支共享一个共同的祖先提交,并且实际上它是head的{​​{1}}提交:

master

这意味着*++ [master] Add 'git show-branch'. fixes分别在mhf中的提交中分支。

答案 2 :(得分:0)

  

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

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

commit d3cc5f4(2017年2月15日)和commit d9e557acommit e6a7c75(2017年2月14日)Jeff King (peff)。 帮助:Pranit Bauva (pranitbauva1997)
Junio C Hamano -- gitster --于2017年2月27日commit 74a7727合并)

  

git show-branch”预计只有很短的分支名称   在存储库中并使用固定长度的缓冲区来保存它们   没有检查溢出。

     

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

中      

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