git pullコマンドはリモートリポジトリで行った変更を現在のブランチに取り込む機能です。多人数で開発を行う際に差異が無くなるので、プロダクトの開発で重宝されるコマンドです。実際、みなさんが Git を用いて開発を行う際、git pull コマンドを必ずと言っていいほど使用しているのではないでしょうか。
そんな便利なgit pullコマンドですが、ブランチの操作を間違えるとコンフリクトが発生する危険性があったりと、便利だからこそ気を付けなければならない点も数多くあります。
本記事では、git pull コマンドに関して基礎的な使い方から注意点やコマンドの応用まで解説していきます。
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 | 現在チェックアウトしているブランチに特定のブランチの情報を取得して取り込む |
それぞれの処理内容を踏まえた上で、以下の2つのコマンド実行例を見てみましょう。
$ git pull repositoryName branchName
と
$ git fetch repositoryName branchName
$ git merge FETCH_HEAD #デフォルトの場合
は実質的に同じ操作をしていると言えますね。
git fetch との違いと git pull に潜むエラーの危険性
冒頭でも触れましたが git fetch と git pull の大きな違いは、 pull した場合は fetch のあとに 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 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 / –rebase / –no-rebase / –no-commit / –no-ff です。
それでは順番に見ていきましょう。
【–all】
$ git pull --all
–all オプションを付けると、上流ブランチなどに関わらず、リモートリポジトリに存在するすべてのブランチの情報を pull します。
【–rebase】
$ git pull --rebase
–rebase オプションを付けた場合、 git pull コマンドの挙動は fetch + merge ではなく fetch + rebase となります。
rebase を行うと、それぞれのブランチの変更が片方のブランチに取り込まれる形でブランチが再統合されます。そのため merge した場合のようなコミットログは作成されず、余計な履歴も残らないためコミットログを整理しながら開発を進めることができます。
ただし、履歴が書き換えられてしまうことから大規模な開発ではチームの規約で禁止されている場合もあります。業務での利用には、事前に確認を取るようにしましょう。
【–no-rebase】
$ git pull --no-rebase
–no-rebase オプションを付けることで、マージコミットを rebase しないことを明示します。実質的な処理の内容としては git pull をオプションなしで実行した場合とほぼ変わりませんが、 rebase することによって生じるリスクを回避できるため、安全に pull することができます。
【–no-commit】
$ git pull --no-commit
上記のコマンドを実行すると、merge した際のコミットを新たに作成しません。
merge を行った後に改めて調整したい際などにはこちらを使用しましょう。
【–no-ff】
$ git pull --no-ff
こちらは –no-commit のオプションとは逆に、必ず merge した際のコミットを作成するコマンドです。
まとめ
git pull の基本的な使い方に関して解説してきました。
この記事の要点は以下のとおりです。
- git pull は、リモートリポジトリの最新情報をfetchしてローカルリポジトリにmergeしてくるコマンド
- 基本的な書き方は $ git pull repositoryName branchName
- 処理は git fetch + git merge と同じ
- git pull に潜むリスク
- 事故が発生した時の戻し方
- 主要オプションの使い方
Git 自体はバージョン管理に便利で、業務での開発には必須ともいえるツールですが、多人数で扱うことでのトラブルも付いて回ります。
そのためGitを利用した開発では事故を起こさないための仕組みづくりが欠かせませんが、しっかりと機能を使うことができれば基本的なコマンドだけでも安全かつ効率的な開発を行うことができます。
またの機会に紹介できればと思いますが、変更内容を一時退避できるコマンド、変更前との差分を出力するコマンド、任意のコミットを参照して反映させることのできるコマンドなど便利なコマンドも多くあります。
使い方を間違えなければどれも便利なコマンドです。数が多く難しく感じるかもしれませんが基本的なものだけでも使えるようにしておくと特にチーム開発では大きな利点になるかと思います。
こちらを参考に Git の理解や興味を惹く一助になれば幸いです。
Gitの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、Gitに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。