git pull
git pull
コマンドは、リモート・リポジトリからコンテンツをフェッチしてダウンロードし、そのコンテンツと一致するようローカル・リポジトリを即時にアップデートするために使用されます。中央リポジトリにおける変更のローカル・リポジトリへのマージは、Git ベースのコラボレーション・ワーク・フローではよく行われるタスクです。git pull
コマンドは、実際には他の 2 つのコマンド(git fetch とその後の git merge)を組み合わせたものです。操作の第 1 ステージでは、git pull
により、git fetch
が HEAD
がポイントされたローカル・ブランチにスコープされて実行されます。コンテンツがダウンロードされると、git pull
のマージ・ワークフローが開始されます。新しいマージ・コミットが作成され、HEAD
が新しいコミットをポイントするようアップデートされます。
git pull の用途
仕組み
git pull
コマンドでは、最初に git fetch
が実行されて、指定されたリモート リポジトリからコンテンツがダウンロードされます。次に git merge
が実行されて、リモート コンテンツ参照がマージされて新しいローカル マージ コミットに進みます。プルとマージのプロセスをより分かりやすく説明するため、main ブランチとリモート origin を含むリポジトリを例として使用します。
このシナリオでは、git pull
によって、ローカルと main が分岐したポイントからのすべての変更がダウンロードされます。この例では E がそのポイントです。git pull
によって、分岐リモート コミット (A-B-C) がフェッチされます。その後、プル プロセスによって、新しい分岐リモート コミットのコンテンツを含む新しいローカル マージ コミットが作成されます。
関連資料
高度な Git ログ
ソリューションを見る
Bitbucket Cloud での Git の使用方法についてのチュートリアルです。
上の図には、新しいコミット H があります。このコミットは、リモート A-B-C コミットのコンテンツおよび統合されたログ メッセージを含む新しいマージ コミットです。この例は、いくつかの git pull
マージ戦略の 1 つです。--rebase
オプションを git pull
に渡し、マージ コミットの代わりにリベース マージの戦略を使用できます。次の例は、リベース プルの動作を示しています。最初の図の開始ポイントで、git pull --rebase
を実行したと想定します。
この図では、リベース プルによって新しい H コミットが作成されていません。代わりに、リベースによってリモート コミット A--B--C がコピーされて、ローカル コミット E--F--G が書き換えられて、ローカルの origin/main コミット履歴に追加されています。
よく使われるオプション
git pull <remote>
現在のブランチの指定したリモートにおけるコピーをフェッチして、それをローカルのコピーに即時マージします。これは、git fetch <remote>
とそれに続く git merge origin/<current-branch>
の実行と同等です。
git pull --no-commit <remote>
既定の呼び出しと同様に、リモートコンテンツはフェッチされますが、新しいマージコミットは作成されません。
git pull --rebase <remote>
前のプルと同じく、git merge
を使用してリモート ブランチをローカル ブランチと統合するのではなく、git rebase
を使用します。
git pull --verbose
プル中に詳細出力が行われ、ダウンロードされているコンテンツとマージの詳細が表示されます。
git pull の説明
git pull
コマンドは Git における svn update
に相当すると考えられます。このコマンドは、ローカル リポジトリを中央リポジトリに同期する簡便な方法です。次の図は、プルを実行したときの各々のステップを説明したものです。
最初はローカル リポジトリが origin と同期されている状態だったものが、git fetch
コマンドを実行したことによって、origin の main に最後に確認した時点から進行があったことが明らかになりました。ここで、git merge
によってリモート main がローカル main に即時にマージされます。
git pull と同期
git pull
は、リモート コンテンツの「同期」に関連する多数のコマンドの 1 つです。git remote
コマンドは、同期コマンドが実行されるリモート エンド ポイントを指定するために使用されます。git push
コマンドは、リモート リポジトリにコンテンツをアップロードするために使用されます。
git fetch
コマンドは、git pull
と混同されがちです。どちらも、リモート コンテンツのダウンロードに使用されます。git pull
と get fetch
には安全上の重要な違いがあり、git fetch
は「安全」なオプション、git pull
は安全ではないオプションと考えられます。git fetch
ではリモート コンテンツがダウンロードされ、ローカル リポジトリの状態は変更されません。一方、git pull
ではリモート コンテンツがダウンロードされ、そのコンテンツに合わせてローカルの状態の変更が即時に試行されます。これにより、ローカル リポジトリで意図しない競合状態が発生する可能性があります。
リベースを用いたプル
--rebase
オプションは、不要なマージ コミットを防止することによって直線的な履歴を確保するために使用できます。多くの開発者はマージよりもリベースを優先します。これは、「他のすべての人が行った変更の上に自分の変更を加えたい」と言っているようなものです。その意味では、git pull
で --rebase
フラグを指定して使用した場合、単純な git pull
よりも svn update
に似ています。
実際、--rebase
フラグを指定したプル操作は非常に一般的なワークフローになっているため、それを行うための専用の設定コマンドが用意されています。
git config --global branch.autosetuprebase always
このコマンドを実行すると、すべての git pull
コマンドで統合の際に git merge
ではなく git rebase
が使用されます。
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
が実行され、git merge
が開始されます。
マージの代わりの git pull リベース
次の例は、リベースを使用した中央リポジトリの main ブランチと同期する方法を示したものです。
git checkout main
git pull --rebase origin
このコマンドを実行すると、他の開発者の作業成果がすべて反映されたものの上にローカルの変更が加えられるようになります。
この記事を共有する
次のトピック
おすすめコンテンツ
次のリソースをブックマークして、DevOps チームのタイプに関する詳細や、アトラシアンの DevOps についての継続的な更新をご覧ください。