【git pull】リモートの変更を取得してマージするコマンドの使い方とrebase・コンフリクト対策

コマンドリファレンス

git pull コマンドは、リモートリポジトリにある最新の変更内容(コミット)を取得し、現在自分が作業しているローカルリポジトリのブランチに自動的に統合(マージ)するためのコマンドです。

共同開発において、他のメンバーが進めたコードを自分の環境に取り込む際、最も頻繁に使用されるコマンドの一つです。しかし、内部で何が行われているかを正しく理解していないと、意図しないマージコミットが作られたり、コンフリクト(衝突)が発生した際に焦ってしまう原因になります。

この記事では、git pull コマンドの仕組みや基本的な使い方、通常のプルと --rebase オプションの違い、さらにはコンフリクト発生時の具体的な解決フローまで、図解を交えてわかりやすく解説します。

git pull の仕組み(fetch + merge)

git pull は、一見すると「リモートからファイルを取得して上書きする」だけのシンプルなコマンドに見えますが、Gitの内部処理としては以下の 2つのコマンドを連続して実行 しています。

  1. git fetch:リモートリポジトリの最新データをローカルのリモート追跡ブランチ(origin/main など)へダウンロードする。
  2. git merge:ダウンロードしたデータを、現在チェックアウトしているローカルブランチに統合(マージ)する。
[リモートリポジトリ] ──── (1) git fetch ────> [リモート追跡ブランチ] (origin/main)
                                                       │
                                                   (2) git merge
                                                       │
                                                       ▼
                                            [ローカルブランチ] (main)

つまり、git pull「リモートの変更を取得(fetch)し、それを自分のブランチに合流(merge)させる」作業を一発で行うショートカットコマンド です。

詳細な差分を確認してから安全にマージしたい場合は、git fetch で情報を取得した後、git diff で差分を確認し、手動で git merge を行うのが安全です。しかし、手軽に変更を取り込みたい場合は git pull が非常に便利です。

git pull の構文と基本的な使い方

git pull の基本的な構文は以下の通りです。

git pull [リモート名] [ブランチ名]

1. 引数なしで実行する(最も一般的)

$ git pull

リモート名やブランチ名を省略した場合、現在チェックアウトしているブランチの「上流ブランチ(追跡対象として設定されているリモートブランチ)」から自動的に変更を取得・マージします。通常、git clone したリポジトリで作業している場合は、引数なしで実行するだけで正しい追跡先からプルされます。

2. リモート名とブランチ名を明示する

$ git pull origin main

リモートリポジトリ originmain ブランチから最新の変更を取得し、現在自分が作業しているブランチにマージします。現在と異なるブランチの最新情報を明示的に指定して取り込みたい場合などに使用します。

git pull の主なオプション一覧

用途に合わせて git pull の挙動をカスタマイズするための主なオプションです。

オプション説明・効果コマンド例
--rebaseマージの代わりにリベースを使用して履歴を一直線にする。git pull --rebase
--ff-onlyFast-Forward(早送り)マージが可能な場合のみプルを許可する(マージコミットを作らない)。git pull --ff-only
--no-commitプルした変更をマージするが、コミットは自動作成せず、一度ステージング状態で止める。git pull --no-commit
-p / --pruneリモートで既に削除された不要なブランチの追跡情報を、ローカルから自動で削除しながらプルする。git pull -p

git pull –rebase の使いどころとメリット

git pull を行う際、Gitの歴史(コミットグラフ)を綺麗に保つために非常によく使われるのが --rebase(リベース)オプション です。

通常のプル(merge)とプル –rebase の違い

通常の git pullgit pull --rebase では、自分のローカルコミットとリモートの最新コミットを統合するアプローチが異なります。

  • 通常の git pull (merge):ローカルのコミットとリモートのコミットを合流させる「マージコミット」が自動的に生成されます。履歴の枝分かれと合流が記録されるため、コミットグラフが複雑になりがちです。
  • git pull --rebase:自分が作成したローカルのコミットを一時的に退避させ、リモートの最新コミットの後に、退避させていたローカルコミットを 「上乗せして再コミット(積み直し)」 します。これにより、コミット履歴が枝分かれせず、一本の直線になります。
【通常の git pull (merge) の履歴】
A ── B ── C (リモートの更新)
  \       \
    D ── E ── F (マージコミットを作成して統合)

【git pull --rebase の履歴】
A ── B ── C (リモートの更新) ── D' ── E' (ローカルコミットがリモートの先に付け変わる)

rebase オプションのメリットと注意点

メリット:履歴が綺麗に一直線になるため、後から変更履歴を遡りやすくなります。また、無駄な「Merge branch ‘main’ of…」といったマージコミットが量産されるのを防げます。

注意点:すでにリモートにプッシュ(git push)して他の人と共有している自分のコミット履歴に対してリベースを行ってはいけません。コミットのハッシュ値が書き換わるため、他の開発者の環境と競合を起こします。あくまで 「まだプッシュしていないローカルのコミット」 をリモートの最新状態に追従させる目的で使いましょう。

【推奨】pull 時のデフォルト設定を指定する

Gitの比較の新しバージョンでは、git pull を実行した際にマージ方法が設定されていないと警告が表示されます。チームの方針に合わせて、以下のコマンドでデフォルトの挙動を設定しておきましょう。

# デフォルトで rebase を使うように設定(推奨)
$ git config --global pull.rebase true

# デフォルトで通常のマージ(merge)を使うように設定
$ git config --global pull.rebase false

# デフォルトで Fast-Forward マージのみを許可するように設定
$ git config --global pull.ff only

git pull でよくあるトラブルと解決手順

git pull は複数のコマンドをまとめて行うため、トラブルが発生しやすいコマンドでもあります。代表的なエラーと対処法をまとめました。

トラブル1:コンフリクト(衝突)が発生した

自分と同じファイルの同じ行をリモート側(他の人)も変更していた場合、Gitはどちらのコードを優先すべきか自動で判断できず、Conflict エラーになります。

Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

コンフリクトはエラーではなく、「競合箇所を人間に解決してほしい」というGitからのメッセージ です。焦らず以下の手順で解消しましょう。

ステップ1:競合ファイルを開いて修正する

競合が発生したファイルを開くと、以下のような 衝突マーカー が挿入されています。

<<<<<<< HEAD
<p>自分がローカルで書き換えた内容</p>
=======
<p>リモートからプルした内容(他の人が変更した内容)</p>
>>>>>>> origin/main

残したいコードを選択して書き換え、<<<<<<<=======>>>>>>> などの マーカー行をすべて綺麗に削除 します。

ステップ2:修正したファイルをステージングする

衝突箇所の修正が終わったら、ファイルを保存し、git add でインデックスに登録します。

$ git add index.html

ステップ3:統合処理を完了させる

git pull を実行したときのマージ方法によって、最後のコマンドが異なります。

  • 通常のプル(merge)の場合:そのままコミットを作成します。
    $ git commit -m "Fix conflict"
  • --rebase を使用していた場合:リベースを続行(continue)させます。
    $ git rebase --continue

※コンフリクト対応中に一旦最初からやり直したいとき

修正作業中に混乱してしまい、一度プルを実行する前の状態に戻したい場合は、以下のコマンドで安全に処理を中断・リセットできます。

# 通常のプルの場合
$ git merge --abort

# --rebase プルの場合
$ git rebase --abort

トラブル2:ローカルの未コミットの変更と衝突した

コミットしていない書きかけのコードがある状態で git pull を実行すると、以下のようなエラーが出てプルが拒否されることがあります。

error: Your local changes to the following files would be overwritten by merge:
    index.html
Please commit your changes or stash them before you merge.
Aborting

これは、未コミットの変更をプルによって上書き・消失してしまわないよう、Gitが処理を中断してくれた状態です。対処法は2つあります。

対処法A:一度コミットしてからプルする(推奨)

キリが良い状態であれば、いったんローカルでコミットを作成してから git pull を行います。

$ git add .
$ git commit -m "作業中のコミット"
$ git pull

対処法B:git stash で一時退避させる

「まだコミットするほどの段階ではないけれど、プルして最新状態を確認したい」という場合は、git stash を使用して一時的に変更を退避させます。

# 1. 変更を一時退避
$ git stash

# 2. プルを実行
$ git pull

# 3. 退避させていた変更を元に戻す(マージする)
$ git stash pop

トラブル3:git pull を取り消して元に戻したい

「git pull したら意図しない変更が大量に入ってしまい、戻したい」「動いていたコードが動かなくなった」といった場合は、以下のコマンドでプルを実行する直前の状態へ強制的に戻すことができます。

# 直前の状態に強制的に戻す(未コミットの変更も消えるため注意)
$ git reset --hard ORIG_HEAD

ORIG_HEAD には、マージやリベースといった履歴を大きく変更するコマンドを実行する前の状態(コミットハッシュ)が自動的に記録されています。そのため、これを指定して git reset --hard を実行すれば、直前のプルを実行する前の綺麗な状態に戻すことが可能です。

まとめ

git pull コマンドは、非常に便利である反面、仕組みを理解しないまま使っていると競合やマージコミットの量産などトラブルに繋がりやすいコマンドです。

  • git pull は fetchmerge のショートカット。
  • 履歴を一直線に保つには git pull --rebase が有効。
  • コンフリクトが起きたら 衝突マーカーを消して修正し、git add ののちマージ完了(または --abort でやり直し)。
  • 未コミットの変更がある場合は git stash で退避させてからプル。
  • 戻したいときは git reset --hard ORIG_HEAD を活用する。

仕組みと適切なオプション、トラブル時の戻し方を頭に入れておくことで、複数人での開発もスムーズかつ安全に進められるようになります。

関連記事:Gitコマンドの基本と応用

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント