- 公開日
- 最終更新日
【Git】ブランチではなくタグを指定してgit mergeする
この記事を共有する
目次
はじめに
公開されているサンプルリポジトリをベースに自分の環境を構築するケースがあるかと思います。
その後、本家リポジトリがバージョンアップしたときに、最新版を取り込んで自分の環境へ反映する、という作業が発生します。
普段はmainブランチから最新版を取得していましたが、tag(バージョン)を指定してmergeする方法を初めてやってみたので、学んだことを残しておこうと思います。
git コマンド
前提
本家のサンプルリポジトリを 「upstream」 という名前で登録しておきます。 また、「upstream」の最新情報をローカルへ取得しておきます。
git remote add upstream <本家リポジトリのURL>
git fetch upstream --tags
マージ
単純ですが、ブランチを指定する場合とtagを指定する場合のmergeコマンドの差は以下の通りです。
# ブランチ(例:main)を指定する場合
git merge upstream/main
# tag(例:v1.2.0)を指定する場合
git merge v1.2.0
補足)取得済みの tag 一覧は 「git tag」 で確認できます。
ブランチ指定とtag指定の違い
以下、それぞれの違いを簡単にまとめてみました。
| ブランチを指定 | tagを指定 | |
|---|---|---|
| 指定する名前 | upstream/main(リモート名で修飾する) |
v1.2.0(tag名そのもの) |
| 取り込む内容 | そのブランチの常に最新のコミット | 固定された特定バージョンの時点 |
| バージョンの安定性 | 変動する(更新のたびに中身が変わる) | 固定される(いつ取り込んでも同じ状態) |
| 向いているケース | 常に最新を追従したいとき | バージョンを明示して安定した状態を取り込みたいとき |
ポイントは、tag はリモート名で修飾しないという点です。ブランチは 「upstream/main」 のように 「リモート名/ブランチ名」 で指定しますが、tag は 「v1.2.0」 のように tag 名を直接指定します。
ここで、「tag指定の場合はリモート名つけなくてよい理由って何?」となり軽く調べてみました。(この内容が今回学んだ内容です。)
保存場所(参照名)の違い
リモートブランチの保存場所( refs/remotes/)
upstream から取得したブランチは、「refs/remotes/upstream/main」 のように remotes配下に 「upstream/ブランチ名」 という形で保存されます。そのため、ブランチを指定するときは 「upstream/main」 と書きます。
タグの保存場所( refs/tags/ )
一方、upstream から取得したタグは、取得元がどこであってもローカルリポジトリの 「refs/tags/v1.2.0」 に直接配置されます。「refs/tags/upstream/v1.2.0」 のようにリモート名が挟まる構造にはなりません。これが、tag を指定するときにリモート名で修飾しない理由だそうです。
おわりに
まだまだGit触り慣れておらず、毎回新しい学びがありますが、いつか使いこなせるように頑張りたい所存です。。。
この記事は私が書きました
中野 友加里
記事一覧身体動かすの好きです。頑張って同じくらい頭も動かします。