這個問題很好玩,也很簡單,只要自己實際操作一把就可以發(fā)現(xiàn),該tag下的代碼是最新的。不過要搞明白為什么,還需要明白Git里的對象和引用這兩個概念。Git一共有四種類型的對象:數(shù)據(jù)對象(blobobject)、樹對象(treeobject)、提交對象(commitobject)和標簽對象(tagobject)。其中標簽對象和提交對象非常類似,可以理解為是提交對象的一個引用。我們每次運行g(shù)itadd和gitcommit命令時,實際上是將被改寫的文件保存為數(shù)據(jù)對象和樹對象,并創(chuàng)建一個提交對象指向頂層的樹對象,這些對象保存在.git/objects目錄下。其次,Git一共有三種類型的引用:HEAD引用、標簽引用和遠程引用,他們分別保存在refs/heads、refs/tags和refs/remotes三個目錄下。HEAD引用代表你創(chuàng)建的代碼分支,標簽引用代表你創(chuàng)建的所有標簽。你可以打開三個目錄下的文件看看,實際上就是一個純文本文件,里面記錄著提交對象(或標簽對象)的SHA-1哈希值,代表這個引用指向哪一次提交。所以,當你推一個tag到遠程倉庫時,是在遠程倉庫的refs/tags目錄下創(chuàng)建一個標簽引用,它要指向一個提交對象,而這個對象由于你還沒push,也會打包發(fā)送到服務器上。但是,由于HEAD引用并沒有更新,所以隨便checkout到哪個分支都看不到這次提交,只有checkout到指定的tag,才能看到這次提交。