RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

【Git入門】git pullって?fetchとmergeとの使い分けをご紹介

Gitを使って開発する際、最新のソースコードを取得する場面は多分にあると思います。
本投稿では、git pullコマンドの基本的な使い方〜主要なオプションの紹介をすると共に、よく混同されがちな、fetchmergeとの違いについてもまとめさせていただきます。
Gitを使い始めたばかりの方から、git pullについて学び直したいという方まで、開発の際に参考にしていただければ幸いです。

弊社ブログのGitに関わる関連記事もぜひご一読ください!

目次

git pullとは?

git pullとは、リモートリポジトリから最新の状態をローカルリポジトリに反映するコマンドのことです。
状態と記載した通り、反映される対象はソースコード等のファイルだけではなく、履歴やログも含まれます。
複数人でシステム開発をする場合、各々の環境から作業を行うため、他の開発者が実装した内容をローカルリポジトリに取り込む必要があります。
「作業の初めに必ずgit pullを実行する」といったルールを作ることで、リモートリポジトリと差分のない状態で開発に着手することができます。

git pullの基本的な使い方

$ git pull

上記コマンドにより、リモートリポジトリの状態をローカルリポジトリに反映することができます。
このように引数無しでコマンドを実行した場合は、作業中のブランチと関連付けられているリモートリポジトリのブランチを対象にpullが実行されます。
この関連付けられているブランチのことをアップストリーム(upstream)ブランチと呼びます。

アップストリームブランチは以下コマンドで確認できます。

$ git branch -vv

実行結果は下記のような出力となります。

$ git branch -vv
* main XXXXXXXX(コミット番号) [origin/main] Merge branch 'feature/hogehoge' into 'main'

上記の例ですと、ローカルのmainブランチのアップストリームブランチがorigin/mainであることが分かります。
また、デフォルトのアップストリーム以外のブランチを指定したい場合はgit pullに引数をつけて実行します。

$ git pull <remote> <branch>

実行例は下記のようになります。

$ git pull origin feature/hogehoge

アップストリームブランチを明示的に設定する場合は、以下コマンドを実行します。

$ git branch --set-upstream-to=<remote>/<branch> [ローカルブランチ名]

git pullfetchmergeの関係性

git fetchは、git pullと同じくリモートリポジトリから最新の状態をローカルに反映するコマンドなのですが、反映先がアップストリームブランチとなります。
また、git mergeはアップストリームブランチからローカルブランチを更新するコマンドとなります。
つまり、git fetchgit mergeの動作を合わせて行うコマンドがgit pullになるのです。

  • git pull
    • リモートブランチの状態をローカルブランチに反映
  • git fetch
    • リモートブランチの状態をローカルのアップストリームブランチに反映
  • git merge
    • アップストリームブランチの状態をローカルブランチに反映

ローカルの作業用ブランチまで一気通貫で最新の状態に更新したい場合はgit pullで問題ありませんが、コンフリクトが発生する際など順を追って作業したい場合にはコマンドを分割して実行するのがよいでしょう。

git pullのオプション紹介

git pullコマンドには様々なオプションがあります。
オプションは以下コマンドで参照可能です。

$ git help pull

コマンドを実行すると、以下のような結果が出力されます。

NAME
       git-pull - Fetch from and integrate with another repository or a local branch

SYNOPSIS
       git pull [<options>] [<repository> [<refspec>...]]

DESCRIPTION
       Incorporates changes from a remote repository into the current branch. In its
       default mode, git pull is shorthand for git fetch followed by git merge FETCH_HEAD.

       More precisely, git pull runs git fetch with the given parameters and calls git
       merge to merge the retrieved branch heads into the current branch. With --rebase,
       it runs git rebase instead of git merge.

       <repository> should be the name of a remote repository as passed to git-fetch(1).
       <refspec> can name an arbitrary remote ref (for example, the name of a tag) or even
       a collection of refs with corresponding remote-tracking branches (e.g.,
       refs/heads/*:refs/remotes/origin/*), but usually it is the name of a branch in the
       remote repository.

       Default values for <repository> and <branch> are read from the "remote" and "merge"
       configuration for the current branch as set by git-branch(1) --track.

       Assume the following history exists and the current branch is "master":

                     A---B---C master on origin
                    /
               D---E---F---G master
                   ^
                   origin/master in your repository

(中略)

OPTIONS
       -q, --quiet
           This is passed to both underlying git-fetch to squelch reporting of during
           transfer, and underlying git-merge to squelch output during merging.

       -v, --verbose
           Pass --verbose to git-fetch and git-merge.

(後略)

コマンドの使い方とオプションに関する説明が詳細に出力されます。
上述のfetchmergeについての説明も記載されています。

本投稿では、このオプション群の中からいくつかを抜粋して紹介させていただきます。

オプション ショートオプション 用途
--quiet -q pull時のメッセージを非表示にする
--verbose -v ダウンロードコンテンツの詳細を表示する
--rebase -r mergerebaseに変更する
--no-commit merge時のコミットを実行しない

※以降の例ではショートオプションをしています。

pull時のメッセージを非表示にする

git pullコマンドはデフォルトで進捗状況が出力されるようになっています。
--progressオプションと同様の動きをします。)

この進捗状況を非表示にする際には-qオプションを使用します。

$ git pull -q

ダウンロードコンテンツの詳細を表示する

$ git pull -v

fetchmergeコマンド双方に対してログが詳細に出力されます。

mergerebaseに変更する

git pullをオプション無しで実行した場合はgit fetchgit mergeの動作が一気通貫で行われますが、-rオプションを使用することでrebaseの動きに変更することができます。

$ git pull -r

rebaseは単体ではコミットの修正や複数のコミットを統合したい際に使用するコマンドです。
リモートにpushする前にコミットを綺麗にすることが可能ですが、過去の履歴を変更できてしまうため、複数人で開発している場合に意図的なコミットの改竄が必要でない限りはmergeを使うのがよいでしょう。
(チームでルールを決めて使用している場合は全く問題ありません。)

merge時のコミットを実行しない

デフォルトでgit pullを実行すると新規のコミットが作成されます。

$ git pull --no-commit

上記オプションを使用すると、コミットを作成する直前に処理が中断されるため、コミットを打つ前にマージ内容を確認し、調整することが可能です。

まとめ

Git入門ということで、git pullコマンドの使い方と一部オプションをご紹介しました。

git pullはコマンド単体のオプションの他に、fetchmergeそれぞれに関連するオプションも多数用意されています。
それぞれの動きを理解することでより柔軟にバージョン管理を行うことができ、「コミットを打つ/打たない」や「履歴をそのまま残す/新しく作成する」等の認識合わせにも使用できると思いますので、よろしければ今後の参考になさってください。


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.