【Git入門者向け】git pullコマンドについて解説

  • 2024.07.26
       
【Git入門者向け】git pullコマンドについて解説

git pullコマンドはリモートリポジトリで行った変更を現在のブランチに取り込む機能であり、開発の差異が無くなるので複数人の開発で重宝されます。実際、みなさんが Git を用いて開発を行う際、git pull コマンドを必ずと言っていいほど使用しているのではないでしょうか。
git pullコマンドは、git fetch と git merge を同時に行うコマンドですが、「リモートリポジトリの最新情報をローカルリポジトリにmergeしてくる。」というイメージが多いかと思います。
内容としては間違いないのですが、「git fetch」と「git merge」の中でも git fetch と混同されやすかったり、「git fetch」や「git clone」とは違ってコンフリクトが発生する危険性があったりと、非常に便利でできることが多いからこそ簡単に事故が発生したりもします。本記事では、そんな git pull コマンドに関して解説ます。

プログラミングの基礎からサイト制作まで
↓実践力が身につくプログラミングスクール↓

ITエンジニアの学校 テックマニアスクール

≫モニター割引キャンペーン実施中!≪

git pullとは

git pullとは、リモートリポジトリから最新の状態をローカルリポジトリにマージするgitコマンドです。git pullでは、ソースコードファイルだけでなく変更履歴やログも反映されます。Git Pullを用いることでリモートリポジトリとローカルリポジトリの同期が簡単に行えます。

複数人でシステム開発をする場合は、それぞれの開発者の開発内容をローカルリポジトリに取り込む必要がありますが、作業前にgit pullを実行することで、リモートリポジトリと差異のない状態から開発に着手できます。

git pullとfetchとmergeの関係

git Pullは「git fetch」と「git merge」を合わせて行うコマンドです。まず、「git fetch」を実行してリモートリポジトリの最新の状態を取得してから「git merge」を呼び出し、取得したブランチをローカルリポジトリの現在のブランチにマージするといった仕組みになっています。

git fetchでは、リモートリポジトリから最新の状態をローカルリポジトリのうちアップストリームブランチに反映させ、git mergeではアップストリームブランチからローカルブランチを更新します。

基本的な使い方

$ git pull repositoryName branchName

基本的にはこの書き方です。
ここでの「repositoryName」と「branchName」は省略することができ、省略した場合は共にデフォルトで「FETCH_HEAD」を参照します。
(「FETCH_HEAD」とは、最後に取得したリモートリポジトリが持つ最新の情報(コミット履歴)です。)

また、「上流ブランチ」を設定して特定のブランチを設定することもできます。
「上流ブランチ」の設定と確認方法は、

#設定したい repositoryName branchName を入力
$ git pull --set-upstream repositoryName branchName
#設定できているかの確認
$ git branch -vv
#この様になっていれば正常に設定できている
*branchName  923efk569 [repositoryName/branchName] <最新のcommit>

この書き方です。ここで設定さえしておけば以降は引数を省略した状態で特定のブランチを参照することができます。
※設定した後、最初の1回は引数を入れた状態で git pull repositoryName branchName とする必要があるので注意してください。

処理自体は git fetch + git merge

繰り返しになりますが、git pull コマンドの処理内容は git fetch とgit merge と同時に行うコマンドです。
そのため、まずは git fetch と git merge それぞれのコマンドの機能を確認してみましょう。ここでは簡単な説明で割愛させていただきますが、それぞれのコマンドが持つ機能は下記の通りです。

コマンド機能
git fetchリモートリポジトリの最新情報を取得して追跡ブランチにコピーする
git merge現在チェックアウトしているブランチに特定のブランチの情報を取得して取り込む

それぞれの処理内容を踏まえた上での例として、

$ git pull repositoryName branchName

$ git fetch repositoryName branchName

から

$ git merge FETCH_HEAD #デフォルトの場合

とは同じですね。

git fetch との違いと危険性

冒頭でも触れましたが git fetch と git pull の違いとしては、merge しているかどうかです。
git fetch ではリモートリポジトリの最新情報を追跡ブランチに取得してきたところで処理が完了します。git pull はそこから merge までを行います。
例として、下記の様な各環境で運用しているサイトあったとします。またリモートリポジトリの名前は origin とします。

#作業環境
* development
#検証環境
* check
#本番環境
* release

この時に、 git pull を使わずに作業環境で施した修正を検証環境に反映させるためには以下の手順になります。

#作業環境から検証環境に移動
$ git checkout check
#リモートリポジトリの最新情報を追跡ブランチにコピー
$ git fetch
#検証環境に作業環境の変更を反映
$ git merge origin development

この状態で検証環境で確認をし、本番環境に反映する場合は以下のようになります。

#検証環境から本番環境に移動
$ git checkout release
#リモートリポジトリの最新情報を追跡ブランチにコピー
$ git fetch
#本番環境に検証環境の変更を反映
$ git merge origin check

ブランチの名前が変わっただけですね。

次に git pull を使った場合はこの様になります。作業環境から本番環境まで一気に見てみましょう。

#作業環境から検証環境に移動
$ git checkout check
#リモートリポジトリの最新情報を追跡ブランチにコピー
$ git pull origin development
#検証環境から本番環境に移動
$ git checkout release
#本番環境に検証環境の変更を反映
$ git pull origin check

このようになります。こちらの方がシンプルで手順も少ないですね。

一方で git pull に関しては、 git fetch の処理の後に merge の処理が追加されるのでコンフリクトなどの事故を発生させる危険性を持つことには注意が必要です。
git pull を使用する場合はどのブランチで merge するのかが非常に重要です。
先程の例では正しく本番環境まで反映した場合でしたが、誤って操作した場合に merge まで行ってしまうので、少なくとも、 git pull を使用する場合には、 git branch などで現在チェックアウトしているブランチを確認してから行うのが望ましいですね。
よって基本的には git fetch を使用するのが良いかと思います。

git pull で事故が発生した時の戻し方

$ git pull

で何か誤って merge した場合にも push さえしなければまだ比較的簡単に直す方法はあります。
基本的には merge した時に戻す時と同じですが、いくつか紹介します。

merge したものを戻す方法

$git revert commitID

こちらで元に戻ります。
このコマンドは施した変更に対し、ちょうど打ち消す様なコミットを新しく作成するというものです。
追加したものは、削除したことに。変更を加えたものは、変更前の状態に改めて変更したことに。の様なコミットを作成するコマンドです。
既存のコミットが残り、打ち消した履歴も残るのでこちらを使用するのが一般的かと思います。

git pull したらコンフリクトが発生した場合

$ git merge --abort

これは、 merge する前の状態に戻すコマンドです。
このコマンドはコンフリクト時の状態から編集していない場合にのみ使用できます。

merge してコンフリクトし、編集を加えていた場合

$ git reset --head HEAD

こちらで戻せます。
このコマンドはコンフリクトした後に加えた編集も含めて merge 前の状態に戻ります。
このコマンドは revert とは違いコミットの履歴も含めて取り消しするコマンドです。勿論、打ち消すなどの履歴も残りません。
履歴を追いかけて修復することも、 reset 自体を取り消すこともできないので使用する際にはより注意が必要です。

git pull に関する主要オプション

ここからは git pull に関する主要なオプションを簡単に解説していきます。

$ git pull -all

上流ブランチなどに関わらず、リモートリポジトリに存在するすべてのブランチの情報を merge する前の状態に戻すコマンドです。

$ git pull --rebase

ログを綺麗にしたい時や merge した時のコミットを作りたくない時の rebase をつけることができます。

$ git pull --no-commit

merge した際のコミットを新たに作成しないというコマンドです。
merge を行った後に改めて調整したい際などにはこちらを使用。

$ git pull --no-ff

こちらは –no-commit のオプションとは逆に、必ず merge した際のコミットを作成するコマンドです。

まとめ

今回、こちらでは git pull の基本的な使い方に関して解説させていただきました。

  • git pull は、リモートリポジトリの最新情報をローカルリポジトリにmergeしてくるコマンド
  • 基本的な書き方は $ git pull repositoryName branchName
  • 処理は git fetch + git merge と同じ
  • git pull の危険性
  • 事故が発生した時の戻し方
  • 主要オプション

Git 自体はバージョン管理に便利に使いやすく、実際に使う機会も多いかと思います。
事故が発生した際には致命傷になり易いので扱いには注意が必要ですが、しっかりと機能を使うことができれば基本的なことだけでも非常に多くことができます。
またの機会に紹介できればと思いますが、変更内容を一時退避できるコマンド、変更前との差分を出力するコマンド、任意のコミットを参照して反映させることのできるコマンドなど便利なコマンドも多くあります。
使い方を間違えなければどれも便利なコマンドです。数が多く難しく感じるかもしれませんが基本的なものだけでも使える様にしておくと特にチーム開発では大きな利点になるかと思います。
こちらを参考に Git の理解や興味を惹く一助になれば幸いです。

Gitの勉強方法は?

書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。

ただ、Gitに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。

プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。

<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~

このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。

     

Otherカテゴリの最新記事