【发布时间】:2020-05-29 03:54:56
【问题描述】:
我克隆了一个存储库。在存储库中有几个分支,但也有一个标签。 现在,我被指示使用该标签的版本。
但是我必须进行一些集成并从该标签中进行更多提交。
我不知道这个标签在分支结构中的什么位置,所以我想做的是把这个标签转换成一个分支(现在,在结帐到那个标签后,我处于“分离状态” ) 以便稍后我可以进行提交合并等。
有没有办法做到这一点?
【问题讨论】:
标签: git tags git-branch
我克隆了一个存储库。在存储库中有几个分支,但也有一个标签。 现在,我被指示使用该标签的版本。
但是我必须进行一些集成并从该标签中进行更多提交。
我不知道这个标签在分支结构中的什么位置,所以我想做的是把这个标签转换成一个分支(现在,在结帐到那个标签后,我处于“分离状态” ) 以便稍后我可以进行提交合并等。
有没有办法做到这一点?
【问题讨论】:
标签: git tags git-branch
你可以签出标签:
git checkout tag_name
然后从中创建一个新分支,因为标签是只读的,并且您只需将更改推送到分支(用于错误修复或功能):
git checkout -b new_branch
【讨论】:
gitk 或 gitg,您可以使用这些工具直观地设置差异。
git log <newbranch>..master 打印在 master 上而不是在 <newbranch> 上的提交。
标签是提交的名称。分支名称也是如此:
$ 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 存储库知道它是一个标签名称,并且它意味着 那个 commit。 现在你打算改变这个事实吗?这对其他 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 现在表示分支 名称。有时它意味着标签。由于分支名称在设计上会随着分支的增长从一个提交(分支的旧尖端)移动到另一个(分支的新尖端),因此这两个名称将来会,解析为两个不同的提交。
只需使用不同的名称。 (并且,作为ROOT points out,您可以在签出标签后按名称创建分支;或者您可以通过git checkout -b new-branch tag-name 一次性完成所有操作。)
【讨论】: