git pull コマンドは使う機会が多いコマンドの1つであり、できることの多いコマンドです。実際、みなさんが Git を用いて開発を行う際、git pull コマンドを必ずと言っていいほど使用しているのではないでしょうか。
git pullコマンドは、git fetch と git merge を同時に行うこのコマンドですが、「リモートリポジトリの最新情報をローカルリポジトリにmergeしてくる。」というイメージが多いかと思います。
内容としては間違いないのですが、「git fetch」と「git merge」の中でも git fetch と混同されやすかったり、「git fetch」や「git clone」とは違ってコンフリクトが発生する危険性があったりと、非常に便利でできることが多いからこそ簡単に事故が発生したりもします。本記事では、そんな git pull コマンドに関して解説させていただきます。
基本的な使い方
1 |
$ git pull repositoryName branchName |
基本的にはこの書き方です。
ここでの「repositoryName」と「branchName」は省略することができ、省略した場合は共にデフォルトで「FETCH_HEAD」を参照します。
(「FETCH_HEAD」とは、最後に取得したリモートリポジトリが持つ最新の情報(コミット履歴)です。)
また、「上流ブランチ」を設定して特定のブランチを設定することもできます。
「上流ブランチ」の設定と確認方法は、
1 2 3 4 5 6 7 8 |
#設定したい 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 | 現在チェックアウトしているブランチに特定のブランチの情報を取得して取り込む |
それぞれの処理内容を踏まえた上での例として、
1 |
$ git pull repositoryName branchName |
と
1 |
$ git fetch repositoryName branchName |
から
1 |
$ git merge FETCH_HEAD #デフォルトの場合 |
とは同じですね。
git fetch との違いと危険性
冒頭でも触れましたが git fetch と git pull の違いとしては、merge しているかどうかです。
git fetch ではリモートリポジトリの最新情報を追跡ブランチに取得してきたところで処理が完了します。git pull はそこから merge までを行います。
例として、下記の様な各環境で運用しているサイトあったとします。またリモートリポジトリの名前は origin とします。
1 2 3 4 5 6 |
#作業環境 * development #検証環境 * check #本番環境 * release |
この時に、 git pull を使わずに作業環境で施した修正を検証環境に反映させるためには以下の手順になります。
1 2 3 4 5 6 |
#作業環境から検証環境に移動 $ git checkout check #リモートリポジトリの最新情報を追跡ブランチにコピー $ git fetch #検証環境に作業環境の変更を反映 $ git merge origin development |
この状態で検証環境で確認をし、本番環境に反映する場合は以下のようになります。
1 2 3 4 5 6 |
#検証環境から本番環境に移動 $ git checkout release #リモートリポジトリの最新情報を追跡ブランチにコピー $ git fetch #本番環境に検証環境の変更を反映 $ git merge origin check |
ブランチの名前が変わっただけですね。
次に git pull を使った場合はこの様になります。作業環境から本番環境まで一気に見てみましょう。
1 2 3 4 5 6 7 8 |
#作業環境から検証環境に移動 $ 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 で事故が発生した時の戻し方
1 |
$ git pull |
で何か誤って merge した場合にも push さえしなければまだ比較的簡単に直す方法はあります。
基本的には merge した時に戻す時と同じですが、いくつか紹介します。
merge したものを戻す方法
1 |
$git revert commitID |
こちらで元に戻ります。
このコマンドは施した変更に対し、ちょうど打ち消す様なコミットを新しく作成するというものです。
追加したものは、削除したことに。変更を加えたものは、変更前の状態に改めて変更したことに。の様なコミットを作成するコマンドです。
既存のコミットが残り、打ち消した履歴も残るのでこちらを使用するのが一般的かと思います。
git pull したらコンフリクトが発生した場合
1 |
$ git merge --abort |
これは、 merge する前の状態に戻すコマンドです。
このコマンドはコンフリクト時の状態から編集していない場合にのみ使用できます。
merge してコンフリクトし、編集を加えていた場合
1 |
$ git reset --head HEAD |
こちらで戻せます。
このコマンドはコンフリクトした後に加えた編集も含めて merge 前の状態に戻ります。
このコマンドは revert とは違いコミットの履歴も含めて取り消しするコマンドです。勿論、打ち消すなどの履歴も残りません。
履歴を追いかけて修復することも、 reset 自体を取り消すこともできないので使用する際にはより注意が必要です。
git pull に関する主要オプション
ここからは git pull に関する主要なオプションを簡単に解説していきます。
1 |
$ git pull -all |
上流ブランチなどに関わらず、リモートリポジトリに存在するすべてのブランチの情報を merge する前の状態に戻すコマンドです。
1 |
$ git pull --rebase |
ログを綺麗にしたい時や merge した時のコミットを作りたくない時の rebase をつけることができます。
1 |
$ git pull --no-commit |
merge した際のコミットを新たに作成しないというコマンドです。
merge を行った後に改めて調整したい際などにはこちらを使用。
1 |
$ git pull --no-ff |
こちらは –no-commit のオプションとは逆に、必ず merge した際のコミットを作成するコマンドです。
まとめ
今回、こちらでは git pull の基本的な使い方に関して解説させていただきました。
- git pull は、リモートリポジトリの最新情報をローカルリポジトリにmergeしてくるコマンド
- 基本的な書き方は $ git pull repositoryName branchName
- 処理は git fetch + git merge と同じ
- git pull の危険性
- 事故が発生した時の戻し方
- 主要オプション
Git 自体はバージョン管理に便利に使いやすく、実際に使う機会も多いかと思います。
事故が発生した際には致命傷になり易いので扱いには注意が必要ですが、しっかりと機能を使うことができれば基本的なことだけでも非常に多くことができます。
またの機会に紹介できればと思いますが、変更内容を一時退避できるコマンド、変更前との差分を出力するコマンド、任意のコミットを参照して反映させることのできるコマンドなど便利なコマンドも多くあります。
使い方を間違えなければどれも便利なコマンドです。数が多く難しく感じるかもしれませんが基本的なものだけでも使える様にしておくと特にチーム開発では大きな利点になるかと思います。
こちらを参考に Git の理解や興味を惹く一助になれば幸いです。