我怎样才能找到我当前分支所基于的git分支?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我怎样才能找到我当前分支所基于的git分支?相关的知识,希望对你有一定的参考价值。
这可能是一个简单的问题(也许之前会被问到?),但我找不到答案(我真的尝试过,我不只是懒惰:))。
我正在开发一个基于另一个分支的git分支。但是,我不知道它基于哪个分支。
是否有命令或方法来找出我当前分支来自哪个分支?
我尝试在SourceTree和git log --graph --all
中查找,但不知何故,当创建分支时,我无法弄清楚起源点。
谢谢!
首先,在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条目。
如果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%的情况,这就是我使用它的原因。
以上是关于我怎样才能找到我当前分支所基于的git分支?的主要内容,如果未能解决你的问题,请参考以下文章