
在軟體開發的過程中,當專案達到一個里程碑,或者準備交付新功能時,我們需要一個清晰的方式來標記這個特定的版本。這時候,Git 的「標籤(Tag)」與 GitHub 的「發布版(Release)」就扮演了至關重要的角色。
許多開發者常常會把這兩者搞混,或者不知道如何有效率地將本地的標籤同步到遠端。這篇文章將完整梳理這兩者的差異,並教你如何從基礎指令一路進階到自動化發布。
一、什麼是 Git Tag?如何查看與管理?
你可以把 Git Tag 想像成生產線上的「版本編號」,它是在 Git 歷史紀錄中指向某個特定提交(Commit)的靜態指標。以下是幾個常用的標籤查詢指令:
- 列出所有標籤 (git tag): 快速查看目前本地倉庫有哪些標籤。如果標籤很多,可以加上
-l配合萬用字元過濾,例如git tag -l "v1.*"只查看 1.x 版本的標籤。 - 查看帶有註解的標籤 (git tag -n): 在列出標籤的同時,一併顯示當初打標籤時留下的註解說明。
- 查看特定標籤詳細資訊 (git show <標籤名>): 例如
git show v1.0.2。這會顯示該標籤是誰在什麼時候建立的,以及對應的程式碼更動內容。 - 在提交歷史中定位 (git log --oneline --graph --decorate): 以精簡的圖表形式展示分支和提交,標籤會以顯眼的顏色標註在對應的 Commit 旁邊,幫助你釐清版本演進。
- 直接查看遠端標籤 (git ls-remote --tags origin): 若你想知道遠端伺服器(如 GitHub)目前有哪些標籤,而不必先拉取程式碼到本地,可以使用此指令。
二、如何將 Git Tag 同步推送到 GitHub?
Git 有一個特別的預設行為:執行 git push 時,並不會自動將標籤傳遞到遠端伺服器。 標籤必須被明確地推送。
- 推送單一標籤: 使用
git push origin <標籤名>(例如 v1.0.0)。 - 推送所有本地標籤: 這是最常用的方式,使用
git push origin --tags,一次把所有本地新增的標籤推送到 GitHub。 - 同步刪除標籤: 如果你在本地刪除了標籤(
git tag -d <標籤名>),GitHub 上的標籤並不會自動消失。你必須手動推送刪除動作:git push origin --delete <標籤名>。
常見的同步狀況排查:
- 推送後 GitHub 沒顯示 Tag: 這是正常現象,請記得改用
git push origin --tags。 - GitHub 上有 Tag 但本地沒有: 執行
git fetch --tags將遠端標籤拉取到本地同步。
三、GitHub Releases 是什麼?與 Tag 有何不同?
簡單來說:Tag(標籤)是給開發者看的,而 Release(發布版)是給使用者看的。
在 GitHub 的語境下,每一個 Release 必然關聯一個特定的 Tag,但它比 Tag 多了更完整的「包裝」。
兩者的核心差異比較:
- 本質與內容: Tag 只是 Git 倉庫中指向某個 Commit 的指標,內容只有程式碼本身;Release 則是建構在 Tag 之上的 GitHub 專屬展示頁面,包含版本說明(Release Notes)、更新日誌與致謝名單。
- 附加檔案: Tag 無法夾帶額外檔案;Release 則允許你上傳編譯好的二進位檔案或安裝包(如
.exe、.apk),讓使用者免去安裝開發環境的麻煩,直接下載執行。 - 可見度: Tag 隱藏在命令列或 Git 歷史紀錄中;Release 則會出現在 Repo 首頁右側最顯眼的位置。
四、邁向自動化:如何建立 GitHub Release?
如果只是為了標記程式碼里程碑,打個 Tag 就夠了。但如果你希望別人能方便地了解更新內容並下載作品,就需要建立 Release。
建立 Release 有幾種常見方式:
1. 網頁端手動建立 在 Repo 首頁右側點擊「Releases」->「Create a new release」,選擇一個 Tag,填寫標題與描述後發布。
2. 使用 GitHub CLI (gh) 如果你安裝了官方命令列工具,可以用一行指令自動抓取 Commit 紀錄並生成 Release: gh release create v1.0.0 --generate-notes
3. 使用 GitHub Actions 實現完全自動化 這是最推薦的進階作法。你可以撰寫一個 YAML 工作流檔案,設定為:「只要推送到 GitHub 的 Tag 是以 v 開頭(如 v1.0.1),就自動觸發並發布 Release。」 設定好之後,你只需要在本地端執行打標籤與推送的指令,GitHub 就會在雲端幫你把版本說明、編譯打包與發布流程全部處理到好。
掌握 Tag 與 Release 的正確用法,不僅能讓程式碼的歷史紀錄井然有序,更能大幅提升專案交付的專業度與效率!
















