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

问题描述 投票:6回答:2

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

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

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

我尝试在SourceTree和git log --graph --all中查找,但不知何故,当创建分支时,我无法弄清楚起源点。

谢谢!

git branch
2个回答
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此外,标签 - 分支名称 - 也可以随时移动或删除。所以,如果你认为branchB是“基于”branchA ,然后有人完全删除branchA,你留下这个:

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

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

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


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

2删除标签意味着通过从该标签开始并向后工作(向左或向上或向上或向下以及向左移动)所发现的提交变得“无法到达”,除非他们'从其他标签开始重新找到。提交图中的无法访问的提交最终会被完全删除,但通常您需要大约30天才能将其恢复。

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


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%的情况,这就是我使用它的原因。

© www.soinside.com 2019 - 2024. All rights reserved.