这可能是一个简单的问题(也许之前会问过?),但我还没有找到答案(我真的尝试过,我不仅仅是懒惰:))。
我正在开发一个基于另一个分支的git分支。但是,我不知道它所基于的分支。
是否有命令或方法找出我当前分支来自哪个分支?
我尝试查看SourceTree以及git log --graph --all
,但不知何故,我无法确定创建分支时的起始点。
谢谢!
答案 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%的情况,这就是我使用它的原因。