開発ブログ

WWWクリエイターズが送る、Git、CSS、HTML、コマンドライン、Macの便利機能など、開発に関する役立ち情報発信します。気まぐれに更新。

git pull を徹底攻略。基本的な使用例と関連オプション。

最終更新:2017-08-12 by Joe

git pull の動作仕様と、オプションを使ったpull コマンドの具体的な使用例についてまとめます。

通常は「リモートレポジトリでの更新の取り込み」の目的で利用するgit pullですが、動作仕様を理解して、よりgit pullを便利に使っていきましょう。

git pull とは?

リモートレポジトリの更新内容をローカルに取得し、現在のブランチに取り込みます。

実際には、「git pull」は「git fetch」と「git merge FETCH_HAED」の2つのコマンドのショートハンドとして動作します。具体的には、「git fetch」を、与えられた引数やオプションで実行した後、そのまま取得したブランチ(= FETCH_HEAD)を現在のブランチにマージします。

git pull の使用例

origin の master ブランチを取り込む

通例、最もよく利用するリモートは「origin」という名前で参照している事が多いと思います。originのmasterブランチが更新され「ローカルより先に進んでいる」ので、最新を取り込みます。

現在、ローカルのmasterブランチをチェックアウトしている状態で、下記を実行します。

なお、このコマンドは下記と同義です。

git fetch はリモートの変更を取り込みますが、更新されるのはローカルの「リモート追跡ブランチ」と関連する参照だけです。ローカルブランチやインデックス、作業ツリーに変更を加えることはありません。

その後に実行される、git merge は現在チェックアウトしているブランチに対してマージを行います。

もしorigin の master ブランチをローカルmasterに取り込むのであれば、先に master をチェックアウトしている状態で git pull を実行する必要があります。

FEATCH_HEADについて

「FETCH_HEAD」はfetch 実行時に更新される、コミットのref(参照)です。.git/FETCH_HEADというファイル名で書き込まれます。主に git pull 実行時に、fetch後のマージ先として使われると考えても良いかもしれません。

.git/FETCH_HEADの中身の例

※実際はSHA-1をはフルで記載されます。上記は見やすさのため改変しています。

「上流ブランチ」の変更を取り込む

現在のローカルのmasterブランチの「上流ブランチ」に、リモートのブランチ「origin/master」が設定されていれば、下記のコマンドで、パラメータをすべて省略できます。

コマンドが簡単になって便利なので、上流ブランチを設定し、バンバン利用しましょう。

上流ブランチの設定状況は git branch コマンドの「-vv」オプションで確認できます。を2つ重ねるのがポイントです。

「-a(--all)」オプションは、リモート追跡を含めてすべてリストします。

上流ブランチとは?

上流ブランチとは、ローカルブランチが特定のリモートブランチの変更を「追跡する」という関係性を示す設定値です。

上流ブランチを設定するには下記の方法があります。

1)リモートブランチから、同名のローカルブランチを新規チェックアウト

2)Push 時に設定

3)明示的に設定

マージせず、リベースする

git fetch 実行後に、通常はマージですが、リベースすることもできます。

fast-forwardしない

通常のgit merge コマンド同様、fast-forward(早送り:参照のみ移動)を行わない時、--no-ffオプションが利用可能です。

fast-forward可能であっても、かならずマージコミットが新しく作成されます。チームの運用方針によっては、利用するかもしれません。

git pullの失敗。原因とその解決

もし、ローカルのmasterとリモートのmasterがコンフリクトしているとき、git pull コマンドはエラーを出力して中止します。これは、単純に自動の git merge が不可能な場合、コンフリクトの解消を行う必要があるのと一緒です。

もしコミットされていない変更が作業ツリーやインデックスにある場合は、警告が発生し、単純にマージが実行されません。作業ツリーはそのままの状態になります。

git mergeを強制する

git mergeがコンフリクトする時は、コンフリクトを解決するのが教科書通りです。

完全に origin/master 側が「正」としているのであれば、「git merge --theirs」などというコマンドで、強制的にリモートを優先してコンフリクト解消する手段もありますが、そもそもマージによって新しいコミットが作られてしまい、リモートとローカルのmasterが一致しなくなります。これは選択肢ではありません。

ここでは、より強力な強制力を持つ「git reset 」を利用して、強制的に一致させます。

git reset --hardによる強制上書き

現在のブランチの状態を「強制的に」他のブランチの状態に合わせるときの方法として、「git reset --hard 」があります。

 

 

 

git pull に関する参考リンク

以上になります。