将git标记转换为分支

将git标记转换为分支,git,tags,git-branch,Git,Tags,Git Branch,我克隆了一个存储库。在存储库中有几个分支,但也有一个标记。 现在,我被指示使用该标签的版本 但是,我必须进行一些集成,并从该标记进行更多的提交 我不知道这个标记在分支结构中的什么位置,所以我想做的是将这个标记转换成一个分支(现在,在签出到该标记后,我进入一个“detached状态”),以便稍后我可以执行提交合并等操作 有办法吗?您只需签出标签即可: git checkout tag_name 然后从它创建一个新分支,因为标记是只读的,您只需将更改推送到分支(用于bug fix或feature)

我克隆了一个存储库。在存储库中有几个分支,但也有一个标记。 现在,我被指示使用该标签的版本

但是,我必须进行一些集成,并从该标记进行更多的提交

我不知道这个标记在分支结构中的什么位置,所以我想做的是将这个标记转换成一个分支(现在,在签出到该标记后,我进入一个“detached状态”),以便稍后我可以执行提交合并等操作


有办法吗?

您只需签出标签即可:

git checkout tag_name
然后从它创建一个新分支,因为标记是只读的,您只需将更改推送到分支(用于bug fix或feature):


标记是提交的名称。分支名称也是如此:

$git rev解析主机
d2ecc46c0981fb829fdfb204604ed0a2798cbe07
$git rev parse v2.21.0^{commit}
8104ec994ea3849a968b4667d072fedd1e688642
现在,您可能想知道
^{commit}
在那里做什么。这是因为标记通常也是带注释标记对象的名称,该对象随后命名提交:

$git rev parse v2.21.0
2bb64867dc05d9a8432488ddc1d22a194cee4d31
$git cat文件-p 2bb64867dc05d9a8432488ddc1d22a194cee4d31
对象8104ec994ea3849a968b4667d072fedd1e688642
类型提交
标签v2.21.0
tagger Junio C Hamano 1551023739-0800
Git 2.21
-----开始PGP签名-----
[剪报]
如果要在标记选择的提交位置启动分支,只需执行以下操作:

git branch newbranch v2.21.0
您不需要
^{commit}
,因为
git分支
本身可以为您解决以下问题:

$git branch newbranch v2.21.0
$git rev parse newbranch
8104ec994ea3849a968b4667d072fedd1e688642
您可能不应该删除标记名并创建标识正确提交的新分支名,也不应该创建与标记名相同的分支名。这两种方法都是允许的,但都不能产生令人满意的结果

特别是,一旦一个标记出现,从那时起拾取它的每个Git存储库都知道它是一个标记名,它意味着提交。现在你打算改变这个事实吗?这对其他Git存储库来说并不好

同时,如果您创建了拼写相同的分支和标记名,Git并不总是以您想要的方式解决问题。即:

$git branch v2.21.0 v2.21.0
$git rev parse v2.21.0
警告:refname“v2.21.0”不明确。
2bb64867dc05d9a8432488ddc1d22a194cee4d31
有时,名称
v2.21.0
现在表示分支名称。有时它意味着标签。由于分支名称在设计上随着分支的增长从一个提交(分支的旧尖端)移动到另一个提交(分支的新尖端),因此这两个名称将来将解析为两个不同的提交


用另一个名字就行了。(如前所述,您可以在签出标记后按名称创建分支;或者您可以执行
git checkout-b new branch tag name
一次完成所有操作。)

谢谢。我做到了。不过有一个问题。我如何知道新分支离…比如主分支有多远?你可以对主分支运行git diff,或者如果你有
gitk
gitg
你可以使用这些工具直观地设置diff。@KansaiRobot
git log..master
打印在
master
上而不是
上的提交在标记中创建一个分支,有没有办法检查它离主分支有多远?您甚至可以在创建分支之前执行此操作。(分支不是“在标记中”创建的,它是指向同一个提交创建的。)定义“多远”的含义:请参阅
git branch newbranch v2.21.0