gpt4 book ai didi

git - 为什么我使用 Git GUI checkout 时没有列出我的标签?

转载 作者:太空狗 更新时间:2023-10-29 13:47:56 28 4
gpt4 key购买 nike

我有一个带有三个注释标签的本地 Git 存储库:v0.1.0 , v0.1.1 , 和 v0.1.2 .

当我使用 gitk 查看我的项目历史时(存储库 → 可视化主人的历史),我可以看到分配给正确提交的每个标签。

Project history in gitk

但是,当我尝试在 Git GUI 中 checkout 我的标签时(Branch → Checkout... → Tags),v0.1.1 的标签没有出现。

Git GUI tag list

当我去检查 gitk 中的每个标签时,我注意到 v0.1.0 的详细信息和 v0.1.2将它们列为 type commit ,而 v0.1.1 的标签被列为 type tag .

Details for tag v0.1.1

值得注意的是,我已经重写了此标签的历史记录以修复拼写错误。我使用 git tag <tag name> <tag name> -f -m "<new message>" 编辑了我的标签消息.

为什么我看不到我的 v0.1.1使用 Git GUI checkout 时标记?为什么显示为type tag ?

最佳答案

标签可以point to any object在 git 仓库中。如果您的标签类型是“标签”,那么您有一个标签指向另一个标签。

轻量级标签不是对象;因此,它们没有自己的哈希 ID,也没有其他任何东西(如另一个标签)可以指向它们。它们实际上只是指向某个对象的哈希 ID 的易于内存的名称,比分支名称小一点。

但是,带注释的标签对象;它们就像提交一样,有自己的消息、作者、创建日期,最重要的是,它们有自己的哈希 ID。这意味着,有些令人困惑的是,它们可以被标记。

果然,正如你在your comment中所描述的那样,这正是发生的事情。根据 How do you rename a Git tag? 中的建议采取行动,您执行了以下操作:

# avoid this...
git tag new old

因为 old 是一个带注释的标签,new 标签的目标将是 old 标签,而不是它指向的提交到。

如果你想重命名一个带注释的标签,你应该使用

git tag -a new old^{}

old^{}dereference the tag recursively until a non-tag object is found (在我们的例子中,提交),并将其用作 new 的目标对象。


为了进一步说明:假设您有一个存储库...哦,就像这个:https://github.com/cyborgx37/sandbox/releases

在此 repo 中,您创建一个带注释的标签,如下所示:

> git tag -m "Version 0.1-beat" v0.1

天啊……你拼错了“beta”,而且你已经决定要将标签名称设为 v0.1-b。由于这已经发布,您决定执行 sane thing并创建一个新标签。正在关注advice you found on the internet , 你通过复制第一个标签来创建你真正想要的标签(我附加了 __tag 原因会变得很清楚):

> git tag -m "Version 0.1-beta" v0.1-b__tag v0.1

只是,这些是带注释的标签,意味着它们是实际对象。因此,当您创建 v0.1-b__tag 时,您实际上将它指向了 v0.1。您可以使用 cat-fileshow 清楚地看到结果。

这是 v0.1:

> git cat-file -p v0.1

object 5cf4de319291579d4416da8e0eba8a2973f8b0cf
type commit # ⇦ v0.1 is a tag which points to a commit
tag v0.1
tagger JDB <jd@domain.com> 1521058797 -0400

Version 0.1-beat
> git show v0.1

# v0.1 is a tag
# ⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩

tag v0.1
Tagger: JDB <jd@domain.com>
Date: Wed Mar 14 16:19:57 2018 -0400

Version 0.1-beat

# which is pointing directly to a commit
# ⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩

commit 5cf4de319291579d4416da8e0eba8a2973f8b0cf (HEAD -> master, tag: v0.1-b__tag, tag: v0.1, origin/master)
Author: JDB <jd@domain.com>
Date: Tue Oct 10 12:17:00 2017 -0400

add gitignore

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..42d9955
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+file.txt

请注意 v0.1-b__tag 在其目标类型和历史记录方面均不同:

> git cat-file -p v0.1-b__tag

object 889b82584b2294486f4956dfea17b05e6224fb7f
type tag # ⇦ v0.1-b__tag is a tag which points to a tag
tag v0.1-b__tag
tagger JDB <jd@domain.com> 1521059058 -0400

Version 0.1-beta
> git show v0.1-b__tag

# v0.1-b__tag is a tag
# ⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩

tag v0.1-b__tag
Tagger: JDB <jd@domain.com>
Date: Wed Mar 14 16:24:18 2018 -0400

Version 0.1-beta

# which is pointing to the v0.1 tag
# ⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩

tag v0.1
Tagger: JDB <jd@domain.com>
Date: Wed Mar 14 16:19:57 2018 -0400

Version 0.1-beat

# which is pointing to the intended target commit
# ⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩⇩

commit 5cf4de319291579d4416da8e0eba8a2973f8b0cf (HEAD -> master, tag: v0.1-b__tag, tag: v0.1, origin/master)
Author: JDB <jd@domain.com>
Date: Tue Oct 10 12:17:00 2017 -0400

add gitignore

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..42d9955
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+file.txt

显然,Git GUI 对于可以 checkout 的对象类型(提交,而不是标签)相当有选择性,因此它会忽略您指向另一个标签的标签。

如果您使用我在上面建议的 git tag -a new old^{} 方法,您可以避免戏剧化并首先得到您想要的东西。我将创建一个新标签 v0.1-b__commit 指向 v0.1 的提交,而不是指向 v0.1 直接:

> git tag -m "Version 0.1-beta" v0.1-b__commit v0.1^{}
> git cat-file -p v0.1-b__commit

object 5cf4de319291579d4416da8e0eba8a2973f8b0cf
type commit
tag v0.1-b__commit
tagger JDB <jd@domain.com> 1521059039 -0400

Version 0.1-beta
> git show v0.1-b__commit

tag v0.1-b__commit
Tagger: JDB <jd@domain.com>
Date: Wed Mar 14 16:23:59 2018 -0400

Version 0.1-beta

commit 5cf4de319291579d4416da8e0eba8a2973f8b0cf (HEAD -> master, tag: v0.1-b__tag, tag: v0.1-b__commit, tag: v0.1, origin/master)
Author: JDB <jd@domain.com>
Date: Tue Oct 10 12:17:00 2017 -0400

add gitignore

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..42d9955
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+file.txt

关于git - 为什么我使用 Git GUI checkout 时没有列出我的标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49283734/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com