Git本地没有push,本地仓库打了tag之后只把tag push了,远程仓库该tag下是最新的代码吗?

Git本地没有push,本地仓库打了tag之后只把tag push了,远程仓库该tag下是最新的代码吗?

阅读 6.1k
2 个回答

这个问题很好玩,也很简单,只要自己实际操作一把就可以发现,该 tag 下的代码是最新的。不过要搞明白为什么,还需要明白 Git 里的 对象引用 这两个概念。

Git 一共有四种类型的对象:数据对象(blob object)、树对象(tree object)、提交对象(commit object)和 标签对象(tag object)。其中标签对象和提交对象非常类似,可以理解为是提交对象的一个引用。我们每次运行 git add 和 git commit 命令时,实际上是将被改写的文件保存为数据对象和树对象,并创建一个提交对象指向顶层的树对象,这些对象保存在 .git/objects 目录下。

其次,Git 一共有三种类型的引用:HEAD 引用标签引用远程引用,他们分别保存在 refs/headsrefs/tagsrefs/remotes 三个目录下。HEAD 引用代表你创建的代码分支,标签引用代表你创建的所有标签。你可以打开三个目录下的文件看看,实际上就是一个纯文本文件,里面记录着提交对象(或标签对象)的 SHA-1 哈希值,代表这个引用指向哪一次提交。

所以,当你推一个 tag 到远程仓库时,是在远程仓库的 refs/tags 目录下创建一个标签引用,它要指向一个提交对象,而这个对象由于你还没 push,也会打包发送到服务器上。但是,由于 HEAD 引用并没有更新,所以随便 checkout 到哪个分支都看不到这次提交,只有 checkout 到指定的 tag,才能看到这次提交。

是最新的。

git add .
git commit -m 'test'
git tag 'v1.0.0'
git push --tags

如果你是这么操作的,那么远程仓库中,注释为test的提交只会出现在 tag v1.0.0中

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进