git pull コマンドは、リモート リポジトリからコンテンツをフェッチしてダウンロードし、そのコンテンツと一致するようローカル リポジトリを即時に更新するために使用されます。中央リポジトリにおける変更のローカル リポジトリへのマージは、Git ベースのコラボレーション ワーク フローではよく行われるタスクです。git pull コマンドは、実際には他の 2 つのコマンド (git fetch とその後の git merge) を組み合わせたものです。操作の第 1 ステージでは、git pull により、git fetchHEAD がポイントされたローカル ブランチにスコープされて実行されます。コンテンツがダウンロードされると、git pull のマージ ワークフローが開始されます。新しいマージ コミットが作成され、HEAD が新しいコミットをポイントするよう更新されます。

git pull の用途

仕組み

git pull コマンドでは、最初に git fetch が実行され、指定されたリモート リポジトリからコンテンツがダウンロードされます。次に git merge が実行され、リモート コンテンツ参照がマージされて、新しいローカル マージ コミットへと進みます。プルとマージのプロセスをより分かりやすく説明するため、master ブランチと origin リモートを含むリポジトリを例として使用します。

このシナリオでは、git pull により、ローカルと master が分岐したポイントからの変更がすべてダウンロードされます。この例では、そのポイントは E です。git pull により、分岐リモート コミット (A-B-C) がフェッチされます。その後、プル プロセスにより、新しい分岐リモート コミットのコンテンツを含む新しいローカル マージ コミットが作成されます。

上の図には、新しいコミット H があります。このコミットは、リモート A-B-C コミットのコンテンツおよび統合されたログ メッセージを含む新しいマージ コミットです。この例は、いくつかの git pull マージ戦略の 1 つです。--rebase オプションを git pull に渡し、マージ コミットの代わりにリベース マージの戦略を使用できます。次の例は、リベース プルの動作を示しています。最初の図の開始ポイントで、git pull --rebase を実行したと想定します。

この図では、リベース プルによって新しい H コミットが作成されていません。代わりに、リベースによってリモート コミット A--B--C がコピーされ、ローカル コミットの E--F--G が書き換えられ、ローカルの origin/master コミット履歴に追加されています。

よく使われるオプション

git pull <remote>

Fetch the specified remote’s copy of the current branch and immediately merge it into the local copy. This is the same as git fetch followed by git merge origin/.

git pull --no-commit <remote>

既定の呼び出しと同様に、リモートコンテンツはフェッチされますが、新しいマージコミットは作成されません。

git pull --rebase <remote>

前のプルと同じく、git merge を使用してリモート ブランチをローカル ブランチと統合するのではなく、git rebase を使用します。

git pull --verbose

プル中に詳細出力が行われ、ダウンロードされているコンテンツとマージの詳細が表示されます。

git pull の説明

You can think of git pull as Git's version of svn update. It’s an easy way to synchronize your local repository with upstream changes. The following diagram explains each step of the pulling process.

最初はローカル リポジトリが origin と同期されている状態だったものが、git fetch コマンドを実行したところ origin の master に最後に確認した時点から進行があったことが明らかになりました。ここで git merge によってリモート master がローカル master に即時にマージされます。

git pull と同期

git pull は、リモート コンテンツの「同期」に関連する多数のコマンドの 1 つです。git remote コマンドは、同期コマンドが実行されるリモート エンド ポイントを指定するために使用されます。git push コマンドは、リモート リポジトリにコンテンツをアップロードするために使用されます。

git fetch コマンドは、git pull と混同されがちです。どちらも、リモート コンテンツのダウンロードに使用されます。git pullget fetch には安全上の重要な違いがあり、git fetch は「安全」なオプション、git pull は安全ではないオプションと考えられます。git fetch ではリモート コンテンツがダウンロードされ、ローカル リポジトリの状態は変更されません。一方、git pull ではリモート コンテンツがダウンロードされ、そのコンテンツに合わせてローカルの状態の変更が即時に試行されます。これにより、ローカル リポジトリで意図しない競合状態が発生する可能性があります。

リベースを用いたプル

--rebase オプションは、不要なマージ コミットを防止することによって直線的な履歴を確保するために使用できます。多くの開発者はマージよりもリベースを優先します。これは、「他のすべての人が行った変更の上に自分の変更を加えたい」と言っているようなものです。その意味では、git pull--rebase フラグを指定して使用した場合、単純な git pull よりも svn update に似ています。

In fact, pulling with --rebase is such a common workflow that there is a dedicated configuration option for it:

git config --global branch.autosetuprebase always

After running that command, all git pull commands will integrate via git rebase instead of git merge.

git pull の例

以下の例は、一般的なシナリオで git pull を使用する方法を示しています。

既定の動作

git pull

git pull の既定の呼び出しの実行は、git fetch origin HEAD および git merge HEAD に相当します (HEAD は現在のブランチをポイントする参照)。

リモートの git pull

git checkout new_feature
git pull <remote repo>

この例では、最初にチェックアウトを実行し、 ブランチに切り替えます。その後、git pull が実行され、 が渡されます。これにより、newfeature ブランチが から暗示的にプルされます。ダウンロードが完了すると、git merge が開始されます。

マージの代わりの git pull リベース

次の例は、リベースを使用した中央リポジトリの master ブランチとの同期方法を示したものです。

git checkout master
git pull --rebase origin

このコマンドを実行すると、他の開発者の作業成果がすべて反映されたものの上にローカルの変更が加えられるようになります。