将 git 标签转换为分支

convert a git tag into a branch

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

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

我不知道这个标签在分支结构中的什么位置,所以我想做的是将这个标签转换成一个分支(现在,在结帐到那个标签后我进入了 "dettached state") 以便稍后我可以进行提交合并等

有办法吗?

您可以直接签出标签:

git checkout tag_name

然后从中创建一个新分支,因为标签是只读的,您只需将更改推送到分支(用于错误修复或功能):

git checkout -b new_branch

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

$ git rev-parse master
d2ecc46c0981fb829fdfb204604ed0a2798cbe07
$ git rev-parse v2.21.0^{commit}
8104ec994ea3849a968b4667d072fedd1e688642

现在,您可能想知道 ^{commit} 在那里做什么。这是因为标签通常也是 带注释的标签对象 的名称,然后将其命名为提交:

$ git rev-parse v2.21.0
2bb64867dc05d9a8432488ddc1d22a194cee4d31
$ git cat-file -p 2bb64867dc05d9a8432488ddc1d22a194cee4d31
object 8104ec994ea3849a968b4667d072fedd1e688642
type commit
tag v2.21.0
tagger Junio C Hamano <gitster@pobox.com> 1551023739 -0800

Git 2.21
-----BEGIN PGP SIGNATURE-----
[snip]

如果你想在标签选择的提交处开始一个分支,就这样做:

git branch newbranch v2.21.0

您不需要 ^{commit},因为 git branch 本身会为您解决:

$ 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
warning: refname 'v2.21.0' is ambiguous.
2bb64867dc05d9a8432488ddc1d22a194cee4d31

有时,名称 v2.21.0 现在意味着 分支 名称。有时它表示 标签 。由于分支名称,根据设计,随着分支的增长,从一个提交(分支的旧尖端)移动到另一个(分支的新尖端),这两个名称将在未来,解决两个不同的提交。

换个名字就好了。 (并且,作为 ,您可以在签出标签后按名称创建分支;或者您可以 git checkout -b new-branch tag-name 一次完成所有操作。)