我正在开展一个由大团队工作的项目。随着时间的推移,人们一直在创建分支并将它们推送到远程仓库。
我如何知道哪个分支是另一个人创建的新分支的根?可以基于当前HEAD创建新分支,但是也可以指定<start-point>
,其可以是提交,标记或分支。如何找出用于创建新分支的分支?
奖励问题:提交可以与分支创建一起推送。我想通过在服务器上使用post receive hook来记录那些与新分支有关的提交。钩子传递给(oldrev,newrev,refname),如果我能找到上面问题的答案,那将会很好。
答案 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
正在与fixes
和mhf
分支进行比较。将此输出视为一个表,每个分支都有自己的列,每个提交都有自己的行。包含提交的分支将在其提交行的列中显示+
或-
。
在输出的最底部,您将看到所有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 d9e557a,commit 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()
,它占用了最大缓冲区大小。