git fetchした内容をマージやリベースする方法
git fetchをした後に、取得してきた内容を作業中のローカルレポジトリのブランチにマージすることが頻繁に発生します。
その場合は更新されたリモート追跡ブランチをマージ、あるいはリベース対象として指定します。
リモート追跡ブランチとは何か?
リモート追跡ブランチとは何か?
Gitではローカルレポジトリのブランチとリモートレポジトリの同じ名前のブランチが直接連携しているわけではありません。
このため、例えば、ローカルレポジトリのmainブランチで作業しているときに、git fetchを行うと、コミット履歴が更新されるのはローカルレポジトリのmainブランチではありません。
リモートレポジトリの各ブランチと直接連動しているブランチは他にあり、そのブランチのことを「リモート追跡ブランチ」と呼びます。
リモート追跡ブランチは「remotes/リモートレポジトリ名/リモートブランチ名」という名前がついているブランチです。(例: remotes/origin/main)
リモート追跡ブランチは「git branch -a」で参照できます。-aはall(全てのブランチ)という意味です。
実例:リモート追跡ブランチの参照
$ git branch -a
* aa
main
vue-router
remotes/origin/HEAD -> origin/main
remotes/origin/aa
remotes/origin/main
上記の例だと、リモートレポジトリには「main」と「aa」の2つのブランチがあり、それぞれのリモート追跡ブランチは「remotes/origin/main」「remotes/origin/aa」となっていることがわかります。
なお、「remotes/origin/HEAD -> origin/main」は取得してきた時点で最新のリモートレポジトリのデフォルトブランチを指しています。
「remotes/origin/HEAD」を使うことはほぼないので、あまり気にする必要はありません。
「remotes/origin/ブランチ名」はよく使うので覚えておく必要があります。
git mergeする方法
git fetchしたコミットをgit mergeする方法
git mergeで現在作業中のブランチに、コミットを取得してきたリモート追跡ブランチの内容を取り込みたい場合は以下のようにします。
git merge <リモートレポジトリ名>/<リモートのブランチ名>
実例
例えば、以下のようなブランチの状態だとします。
$ git branch -a
aa
main
* test
remotes/origin/HEAD -> origin/main
remotes/origin/aa
remotes/origin/main
このときに、現在のtestブランチにおいて、リモート追跡ブランチ「remotes/origin/aa」の内容をマージで取り込みたい場合は以下のようにします。
$ git merge origin/aa
Updating a90d4ef..0701d9d
Fast-forward
docker-compose.yml | 2 ++
1 file changed, 2 insertions(+)
すると、git fetchしてきた最新のリモートレポジトリ「origin」の「aa」ブランチの情報をマージすることができます。
git rebaseする方法
git fetchしたコミットをgit rebaseする方法
git rebaseで現在作業中のブランチに、コミットを取得してきたリモート追跡ブランチの内容を取り込みたい場合は以下のようにします。
git rebase <リモートレポジトリ名>/<リモートのブランチ名>
実例
例えば、以下のようなブランチの状態だとします。
$ git branch -a
aa
main
* test
remotes/origin/HEAD -> origin/main
remotes/origin/aa
remotes/origin/main
このときに、現在のtestブランチにおいて、リモート追跡ブランチ「remotes/origin/aa」の内容をリベースで取り込みたい場合は以下のようにします。
$ git rebase origin/aa
Successfully rebased and updated refs/heads/test.
すると、git fetchしてきた最新のリモートレポジトリ「origin」の「aa」ブランチのコミット履歴を取り込むことができます。