5分でわかる!git fetch (original) (raw)
はじめに
FM_Harmonyです、8月2回目の投稿になります。
↓前回の記事はコチラですtech-blog.rakus.co.jp
今回はgitコマンドのfetchについて、学んだ内容をまとめてみました。
今回の記事を書こうと思ったきっかけはpullとfetchの違い
について尋ねられた時、細かいところまで答えられなかったことです。
(大雑把にfetchはデータを持ってくるだけ、pullはmergeまで行う
ということまでは答えられたのですが...)
そこで、この機会にfetchについて学びなおしてみました。
Gitを学び始めたばかりの方や、復習したいと考えている方の参考になれば幸いです。
fetchの説明...の前にリモート追跡ブランチの説明
fetchを説明するうえでリモート追跡ブランチの説明は欠かせません。
では、リモート追跡ブランチとは何でしょうか?
リモート追跡ブランチ(Remote-tracking branch)とは、ローカルリポジトリにあってリモートリポジトリの状態を保持する参照です。
簡単に言うと、リモートにある同名のブランチと同一のコミットを指すブランチの事です。
このブランチの特徴として、リモート追跡ブランチのブランチ名は(リポジトリ名)/(リモートのブランチ名)で固定される、ユーザが変更をコミットするなどしてブランチが指すコミットを直接操作することはできない、といったことが挙げられます。
そのため、ローカルリポジトリからもリモート追跡ブランチを通じて、リモートリポジトリの変更を確認する、ローカルの作業ブランチにリモートの変更を取り込むといったことができるようになっています。
しかし、ローカルリポジトリは24時間365日ネットワークに接続はしていません。
そのため、ローカルリポジトリにあるリモート追跡ブランチは常にリモートのブランチと同じものを指すわけではありません。
誰かがリモートのブランチに変更をpushしてしまうと、リモート追跡ブランチとリモートにある同名のブランチが指すコミットが異なるということが発生します。
この状況を解消するために使うコマンドがfetch
なのです!
本題、fetchの説明
fetchコマンドを利用することで、リモートリポジトリの変更をローカルリポジトリに取り込み、リモート追跡ブランチを同期することができます。
例えば、下記のコマンドを利用すると、リモートリポジトリorigin
のmaster
ブランチについて、変更をローカルリポジトリに取り込み、リモート追跡ブランチorigin/master
をリモートブランチmaster
と同期させます。
$ git fetch origin master
この時点では、ローカルの作業ブランチに変更は反映されません。
そのため、例えばローカルのブランチmaster
に対してコミットを行っていた場合、リモート追跡ブランチとローカルのブランチとが分岐することになります。
merge, pullの説明
さて、こうして取り込んだリモートブランチの変更をローカルブランチに反映するにはどうすればよいでしょうか?
その方法の一つとして、ローカルブランチにリモート追跡ブランチをmergeするという方法があります。
例えば、origin/master
とローカルブランチmaster
が分岐する場合、下記のコマンドを実行することで図のようなブランチ構造になります。
$ git checkout master $ git merge origin/master
また、同じコマンドを実行した場合でも、origin/master
がローカルブランチの先のコミットを指しているだけで分岐していない場合、master
の指すコミットを変更するだけのいわゆるFast-forwardマージを行います。
別の方法として、pull
コマンドを利用するというものがあります。
これは、fetch + merge
と同じ動作を行います。
すなわち、
$ git checkout master $ git pull origin master
というコマンドは、下記のコマンドと同義です 。*1
$ git checkout master $ git fetch origin master $ git merge origin/master
おわりに
fetchについて簡単にまとめてみたのですが、いかがでしたでしょうか。
個人的にはリモート追跡ブランチの存在を知らなかったため、この機会に知ることができて良かったと思います。
今回の記事作成を通して、Gitについてまだまだ知識が足りないことが分かったので、また別の機会に他の操作(addやpush, etc...)について、機会を作って調べてみようと思います。
参考
- Git - リモートブランチ
Gitの公式によるリモート追跡ブランチとfetchの説明です
- エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/ - カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
rakus.hubspotpagebuilder.com - ラクスDevelopers登録フォーム
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ - イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com
*1:厳密には同義ではなく、masterにmergeされるのはFETCH_HEADというfetchした際に作成されるブランチです。