Gitを使って開発する際、最新のソースコードを取得する場面は多分にあると思います。
本投稿では、git pull
コマンドの基本的な使い方〜主要なオプションの紹介をすると共に、よく混同されがちな、fetch
とmerge
との違いについてもまとめさせていただきます。
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 pull
とfetch
とmerge
の関係性
git fetch
は、git pull
と同じくリモートリポジトリから最新の状態をローカルに反映するコマンドなのですが、反映先がアップストリームブランチとなります。
また、git merge
はアップストリームブランチからローカルブランチを更新するコマンドとなります。
つまり、git fetch
とgit 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. (後略)
コマンドの使い方とオプションに関する説明が詳細に出力されます。
上述のfetch
とmerge
についての説明も記載されています。
本投稿では、このオプション群の中からいくつかを抜粋して紹介させていただきます。
オプション | ショートオプション | 用途 |
---|---|---|
--quiet | -q | pull 時のメッセージを非表示にする |
--verbose | -v | ダウンロードコンテンツの詳細を表示する |
--rebase | -r | merge をrebase に変更する |
--no-commit | merge 時のコミットを実行しない |
※以降の例ではショートオプションをしています。
pull
時のメッセージを非表示にする
git pull
コマンドはデフォルトで進捗状況が出力されるようになっています。
(--progress
オプションと同様の動きをします。)
この進捗状況を非表示にする際には-q
オプションを使用します。
$ git pull -q
ダウンロードコンテンツの詳細を表示する
$ git pull -v
fetch
とmerge
コマンド双方に対してログが詳細に出力されます。
merge
をrebase
に変更する
git pull
をオプション無しで実行した場合はgit fetch
+git merge
の動作が一気通貫で行われますが、-r
オプションを使用することでrebase
の動きに変更することができます。
$ git pull -r
rebase
は単体ではコミットの修正や複数のコミットを統合したい際に使用するコマンドです。
リモートにpushする前にコミットを綺麗にすることが可能ですが、過去の履歴を変更できてしまうため、複数人で開発している場合に意図的なコミットの改竄が必要でない限りはmerge
を使うのがよいでしょう。
(チームでルールを決めて使用している場合は全く問題ありません。)
merge
時のコミットを実行しない
デフォルトでgit pull
を実行すると新規のコミットが作成されます。
$ git pull --no-commit
上記オプションを使用すると、コミットを作成する直前に処理が中断されるため、コミットを打つ前にマージ内容を確認し、調整することが可能です。
まとめ
Git入門ということで、git pull
コマンドの使い方と一部オプションをご紹介しました。
git pull
はコマンド単体のオプションの他に、fetch
とmerge
それぞれに関連するオプションも多数用意されています。
それぞれの動きを理解することでより柔軟にバージョン管理を行うことができ、「コミットを打つ/打たない」や「履歴をそのまま残す/新しく作成する」等の認識合わせにも使用できると思いますので、よろしければ今後の参考になさってください。
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/
カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
https://rakus.hubspotpagebuilder.com/visit_engineer/rakus.hubspotpagebuilder.com
ラクスDevelopers登録フォーム
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/
イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com