我怎样才能找到我当前分支所基于的git分支?

时间:2014-10-31 17:01:16

标签: git branch

这可能是一个简单的问题(也许之前会问过?),但我还没有找到答案(我真的尝试过,我不仅仅是懒惰:))。

我正在开发一个基于另一个分支的git分支。但是,我不知道它所基于的分支。

是否有命令或方法找出我当前分支来自哪个分支?

我尝试查看SourceTree以及git log --graph --all,但不知何故,我无法确定创建分支时的起始点。

谢谢!

2 个答案:

答案 0 :(得分:7)

首先在git中确实没有这样的概念。

这可能是最好的例子。请考虑以下提交图片段:

        o    <-- branchA
       /
o--o--o
    \
     o--o    <-- branchB

此处,“显然”branchB来自branchA。但等等,还有更多,我遗漏了一点:

        o    <-- branchA
       /
o--o--o--o   <-- branchC
    \
     o--o    <-- branchB

现在,branchB是关闭branchA还是关闭branchC

最棘手的部分是,任何这些分支都可以在任何顺序中创建; 1 此外,标签 - 分支名称 - 也可以移动或删除 2 因此,如果您认为branchB“基于”branchA,那么有人会完全删除branchA ,你留下了这个:

o--o--o--o   <-- branchC
    \
     o--o    <-- branchB

现在branchB显然基于branchC,而不是branchA

[编辑:如果您要识别特定的提交,其中两个分支首先“拆分”,请使用git merge-base。找到提交后,您可以看到其他分支名称对git branch --contains也可能有用,等等。这里的一般规则是提交图形就是你真正拥有的:分支名称之类的标签只有在你或其他人以后更改它们之前才有效。标签标签通常应该保留在原来的位置,但即使那些可以移动,通常更多的是痛苦。]


1 好吧,几乎所有:新提交的父提交必须存在才能创建子提交,除非你有办法打破SHA-1加密哈希。

2 删除标签意味着通过从该标签开始并“向后”工作(左侧,可能向上或向下以及向左移动)所发现的提交这些图纸)变得“无法到达”,除非通过从其他标签开始找到它们。提交图中的无法访问的提交最终完全被删除 3 ,但通常你有大约30天的时间来取回它们。

3 这是通过git的“reflogs”实现的。每个reflog条目的工作方式类似于常规标签,以使提交“可达”并因此保留它。它实际上是过期的reflog条目。

答案 1 :(得分:0)

如果git-gc(1)没有启动并删除信息,请在$ PATH中创建一个shell脚本,并使用以下命令将其命名为git-fork-point

#!/bin/sh

if [ $# -gt 0 ]
then
    target="$1"
else
    target=$(git branch|sed -ne 's,^\* ,,p')
fi

git reflog |sed -nE \
    "s,^([a-f0-9]+).*: checkout: moving from ([^[:space:]]+) to ${target}\$,Forked on commit \1 from \2.,p" |tail -1

它现在可用作git fork-point并默认为当前分支。

这是基于这样的假设,即与结账相关联的分支名称的第一次出现会创建一个新的分支(reflog按时间顺序反向,因此尾部为-1)。

这有两个问题:

  • 在发现一个使用了错误的父级之后重新使用分支名称,确实列出了错误的父级
  • 如果缺少历史记录,则只会在第一次切换时列出。

它适用于80%的情况,这就是我使用它的原因。