チーム開発で「他のメンバーが更新したコードを自分の環境に反映したい」と思ったことはありませんか。git pullはまさにその課題を解決するコマンドです。
この記事では、git pullの基本的な使い方から、--rebaseと--mergeの使い分け、よくあるエラーの解決方法まで解説します。Git初心者の方も、普段なんとなく使っている方も、この記事を読めばgit pullを正しく理解できるようになります。
git pullの概要
git pullは、リモートリポジトリから変更を取得し、現在のブランチに統合するコマンドです。内部的にはgit fetchとgit merge(またはgit rebase)を組み合わせた処理を実行します。
簡単に言えば、GitHubなどのリモートにある最新のコードを、自分のローカル環境に反映するための命令です。チーム開発では毎日のように使う基本コマンドなので、しっかり理解しておきましょう。
git pullの仕組み
git pullは2つのステップで動作します。まずgit fetchを実行してリモートブランチの変更を取得し、次にgit mergeでその変更を現在のブランチに統合します。
# git pullは内部的にこの2つのコマンドを実行している
git fetch origin
git merge origin/mainデフォルトではfast-forward更新が可能な場合はマージコミットを作成せず、履歴がきれいに保たれます。ローカルとリモートで分岐がある場合は、マージコミットが作成されます。
基本的な使い方
シンプルなpull
最も基本的な使い方は、引数なしでgit pullを実行することです。上流ブランチ(通常はorigin)から変更を取得してマージします。
# 上流ブランチから取得してマージ
git pullリモートとブランチを指定する
特定のリモートリポジトリやブランチを明示的に指定することもできます。複数のリモートを使っている場合や、別のブランチから変更を取り込みたい場合に便利です。
# originのmainブランチから取得
git pull origin main
# upstreamのdevelopブランチから取得
git pull upstream develop主要なオプション
git pullには多くのオプションがありますが、特に重要なものを紹介します。
| オプション | 説明 |
|---|---|
--rebase | マージの代わりにリベースを実行 |
--ff-only | fast-forward更新のみ許可(分岐があると失敗) |
--no-commit | マージだけしてコミットは作成しない |
--no-ff | 常にマージコミットを作成 |
--prune | リモートで削除されたブランチをローカルからも削除 |
–rebaseオプション
--rebaseを付けると、マージの代わりにリベースを実行します。ローカルのコミットがリモートの変更の「後ろ」に移動し、履歴が線形になります。
# リベース方式で更新
git pull --rebase origin main–ff-onlyオプション
--ff-onlyを付けると、fast-forward更新のみを許可します。ローカルに独自のコミットがある場合は失敗するので、予期しないマージを防げます。
# fast-forward更新のみ許可
git pull --ff-only origin maingit fetch vs git pull
git fetchとgit pullの違いを理解することは重要です。git fetchは変更を取得するだけで、ローカルブランチには影響を与えません。
| 項目 | git fetch | git pull |
|---|---|---|
| 動作 | 変更を取得するのみ | 取得+マージ/リベース |
| 安全性 | 安全(ローカル変更なし) | ローカルブランチを変更 |
| 制御 | 変更を確認してから統合可能 | 自動で統合 |
コンフリクトが心配な場合は、まずgit fetchで変更を取得し、内容を確認してからgit mergeする方法がおすすめです。
# まずfetchで取得
git fetch origin
# 差分を確認
git log HEAD..origin/main
# 問題なければマージ
git merge origin/main–rebaseと–mergeの使い分け
git pullでは--rebaseと--merge(デフォルト)のどちらを使うか選べます。それぞれに適した場面があるので、使い分けを理解しましょう。
–rebaseを使うべき場面
リベースはローカルのコミットがまだプッシュされていない場合に適しています。クリーンな線形履歴を維持したい場合や、長期間のフィーチャーブランチで最新のmainを取り込む場合にも有効です。
# ローカルの未プッシュコミットをリベース
git pull --rebase origin mainただし、リベースは履歴を書き換えるため、他の誰も知らないローカルコミットに対してのみ使用すべきです。
–merge(デフォルト)を使うべき場面
マージはプルリクエストを作成した後や、公開済み・共有済みのブランチで作業している場合に適しています。他の開発者の変更を取り込む場合も、マージの方が安全です。
迷った場合はマージを使用しましょう。履歴は少し複雑になりますが、安全に操作できます。
グローバル設定で統一する
チームでルールを統一したい場合は、グローバル設定を使用できます。
# 全pullでリベースを使用
git config --global branch.autosetuprebase always
# 特定ブランチのみリベースを使用
git config branch.feature.rebase trueよくあるエラーと解決方法
git pullを使っていると、いくつかのエラーに遭遇することがあります。代表的なエラーと解決方法を紹介します。
マージコンフリクト
両方のブランチで同じ行が変更された場合に発生します。
CONFLICT (content): Merge conflict in file.txt
Automatic merge failed; fix conflicts and then commit the result.ファイルを開いて<<<<<<<、=======、>>>>>>>のマーカーを確認し、手動で解決します。解決後はgit addとgit commitで完了です。
# コンフリクトを解決した後
git add file.txt
git commit -m "Resolve merge conflict"
# 中止する場合
git merge --abortローカル変更が上書きされる警告
コミットされていない変更がある状態でpullしようとすると発生します。
error: Your local changes would be overwritten by mergegit stashで変更を一時退避し、pull後に復元します。
# 変更を退避
git stash
# pullを実行
git pull origin main
# 変更を復元
git stash applyfast-forwardできない
ローカルとリモートが分岐している状態で--ff-onlyを使った場合に発生します。
fatal: Not possible to fast-forward, aborting--rebaseでリベースするか、--no-ffでマージコミットを作成します。
# リベースで解決
git pull --rebase origin main
# またはマージで解決
git pull --no-ff origin main追跡情報がない
上流ブランチが設定されていない場合に発生します。
There is no tracking information for the current branch上流ブランチを設定すれば解決します。
git branch --set-upstream-to=origin/main main無関係な履歴のマージ拒否
共有コミット履歴がないリポジトリ同士をマージしようとすると発生します。
fatal: refusing to merge unrelated histories--allow-unrelated-historiesオプションで強制的にマージできます。
git pull origin main --allow-unrelated-historiesベストプラクティス
git pullを効果的に使うためのベストプラクティスを紹介します。
頻繁にpullする
毎日の作業開始前にpullを実行し、大きな競合を防ぎましょう。小さな増分変更の方が管理しやすく、コンフリクトも解決しやすくなります。
pull前に状態を確認する
git statusで現在の状態を確認し、未コミットの変更がないことを確認します。コンフリクトが予測される場合は、先にgit fetchで内容を確認してからマージすると安全です。
# 状態を確認
git status
# コンフリクトが心配なら先にfetch
git fetch origin
git log HEAD..origin/mainブランチ作成前にpullする
新しいブランチを作成する前にpullを実行し、最新のコードベースから分岐しましょう。古いコードから分岐すると、マージ時にコンフリクトが発生しやすくなります。
push前にpullする
プッシュする前にpullを実行し、リモートの最新変更を取り込みます。これにより、プッシュ時のエラーを防げます。
注意事項
git pull --rebaseは履歴を書き換えるため、すでにプッシュしたコミットに対しては使用しないでください。公式ドキュメントでも「危険な操作モード」として警告されています。
プッシュ済みのコミットをリベースすると、他の開発者の環境で問題が発生する可能性があります。リベースはローカルの未プッシュコミットに対してのみ使用しましょう。
まとめ
git pullはリモートの変更を取得してローカルに統合する基本コマンドです。内部的にはgit fetchとgit mergeを実行しており、--rebaseオプションでリベース方式に切り替えることもできます。
チーム開発では毎日のようにpullを実行することになるので、エラーが発生したときの対処法も覚えておくと安心です。迷ったときはまずgit fetchで変更を確認してから、マージするかどうかを判断しましょう。
参考リンク
公式ドキュメントとしてGit – git-pull Documentationがあります。全オプションの詳細が記載されているので、困ったときに参照してください。
入門者向けの解説としてGit Pull | Atlassian Git TutorialやGitHub Git Guides – git pullがおすすめです。
rebaseとmergeの違いを詳しく知りたい場合はMerging vs. Rebasing | Atlassianを参照してください。



