【Git】pullとfetchの違いや使い分け
pull
、fetch
、merge
...Gitは便利ですが、さまざまなことができるが故に、その使い時、使い分けが少し難しく感じられることもあるかもしれません。
今回は、そんな中からGitのpull
とfetch
についてまとめていきます。
Gitのpullとfetchについて
pullとは?
pull
は、fetch
とmerge
を一度に行う操作です。リモートリポジトリの最新の変更内容を取り込み、自動的に現在の作業ブランチにマージします。
つまり、一度に以下の2つの操作を行います:
- リモートの変更を取得(fetch)
- 取得した変更を現在のブランチに統合(merge)
pullの使用例
リモートの変更を取得しつつ、そのままマージまで行う:
git pull # シンプルに取得してマージ(だいたいこれでじゅうぶん)
ブランチを指定するなら:
git pull origin <ブランチ名>
git pull origin main # (例)mainブランチの内容を取得してマージ
fetchとは?
fetch
は、リモートリポジトリの最新の変更内容をローカルリポジトリに取り込む操作です。
ポイントは、fetch
は変更を取り込むだけで、自動的にマージはしないということです。
fetchの使用例
まずは変更内容取得(この時点では反映されない):
git fetch # シンプルに全取得(だいたいこれでじゅうぶん)
git fetch origin <ブランチ名> # 特定のブランチだけ取得したい場合
git fetch --all # 全リモート・全ブランチの完全取得(複数リモートがある場合)
状況に合ったものをどれかひとつ使ってみましょう。
そして変更内容取得後の差分確認をするなら:
git diff origin/<ブランチ名> # 特定のブランチとの差分確認
git diff origin/main # (例)mainブランチとの差分確認
変更内容確認後、問題なければ取り込みましょう(ここで反映される):
git merge origin/<作業ブランチ名> # 取得した変更を現在のブランチにマージ
git merge origin/develop # (例)developにマージ
図1. pullとfetchの違いを図示
- 左:
pull
は直接ローカルブランチに取り込む - 右:
fetch
は一旦origin/mainに取り込み、確認後にマージ
pullとfetchの使い分け
では次は具体的な場面をいくつか挙げて、それぞれの使い分けを見ていきましょう。
Scene1: 他の人の変更を確認したい
あなたはチームで開発中。他のメンバーが加えた変更を確認したい。
しかしまだ自分の作業中のコードにマージはしたくない。
こんな場合はfetch
がおすすめです:
git fetch # どんな変更があるか確認
git diff origin/main # 特定のブランチとの差分確認(必要に応じて)
これで自分の作業に影響を与えることなく、他のメンバーの変更内容を安全に確認できます。
Scene2: 最新の変更をすぐに取り込みたい
他のメンバーが何か重要な更新をプッシュした。
あなたはそれをすぐに自分の作業ブランチに取り込みたい。
このような場合はpull
が便利です:
git pull # シンプルに全取得してマージ
git pull origin main # もしくは特定のブランチの内容を取得してマージ
pull
を使うことで、最新の変更を簡単かつ迅速に取り込むことができます。
Scene3: コンフリクトの可能性がある場合
リモートリポジトリに大きな変更があるかもしれない。
しかし今取り込むと自分の作業とコンフリクト(衝突)する可能性がある。
このような場合には慎重に対応しましょう。
まずfetch
を使って変更内容を確認し、必要に応じて手動でマージすると良いです:
git fetch # シンプルに変更全取得
git fetch origin main # もしくは特定のブランチだけ取得したい場合
これでどのような変更があったか確認できます。
その後、必要に応じて手動でマージを行うことで、コンフリクトがあっても慎重に解決できます。
💡Tips
慣れるまではfetch
を使って変更内容を確認すると良いですね。予期せぬコンフリクトを避け、リポジトリの状態を安全に確認できるようになります。
pull
は便利ですが、自動的にマージを行うため、場合によっては予期せぬ結果を招くかもしれない点に注意が必要です。
🗣 Q&A
git fetch
をしても、自分の手元に変更が反映されないのはなぜ?
Q1: A: git fetch
は、リモートリポジトリの最新の変更をローカルに取り込みますが、自動的にマージはしません。つまり、git fetch
の段階ではまだ変更の確認をしただけで手元のファイルには反映されないのです。
変更を反映させるには、fetchの後に以下のいずれかを行う必要があります:
-
git merge origin/main
を実行し、フェッチした変更をマージする。 -
git pull
を使用する(これはfetch
とmerge
を一度に行います)。
Q2: VSCodeでpullをしたら変更の同期というのが出た
A: この変更の同期というのは、VSCodeでGitを使用して開発を行う際にリモートリポジトリから変更を取り込んだ後(例えばgit pull
を実行した後)やローカルで新しいコミットを作成した後に表示されることがあります。
これは、ローカルの変更をリモートリポジトリと同期させる機能です。
このボタンをクリックすると、以下の操作が自動的に行われます:
- ローカルの新しいコミットをリモートにプッシュ
- リモートの新しい変更をローカルにプル
これにより、ローカルとリモートの状態がワンプッシュで同期されます。
git pull
を実行するのは同じ?
Q3: VSCodeの「変更の同期」ボタンを押すのと、ターミナルでA: 基本的な動作は似ていますが、完全に同じではありません。
-
git pull
はリモートの変更をfetch
し、現在のブランチにマージします。 - VSCodeの変更の同期を押した場合、基本的に以下の操作を行います:
- ローカルの変更をコミット(必要な場合)
- リモートの変更をプル
- ローカルの変更をプッシュ
つまり、変更の同期はより包括的で、双方向の同期を行います。ボタン一つ押すだけで便利な機能ですが、より細かい制御が必要な場合はコマンドラインの使用がより安全でお勧めです。
git pull
を実行したら「マージ競合」が発生してしまった。
Q4: A: マージ競合(Merge Conflict)は、同じファイルの同じ部分が異なる方法で変更された場合に発生します。
解決手順は以下の通りです:
- VSCodeの場合は、ファイルを開くと競合している部分が表示されます。
- 競合している各部分を確認し、最終的にどの内容を取り込みたいか決めます。
- 必要に応じてコードを編集し、発生しているすべての競合を解決します。
- 競合を解決したファイルを保存します。
- 変更をステージングし、コミットします。
VSCodeには競合解決を支援する機能があり、「現在の変更を受け入れる」「受信した変更を受け入れる」などのオプションが表示されます。それらの機能や表示を手掛かりに慎重に地道に解決しましょう。
まとめ
この記事ではGitのpull
とfetch
の違いや使い時、使い分けについてまとめてみました。
迅速に最新の変更を取り込みたい場合はpull
を。安全に変更を確認してから必要に応じて反映したい場合はまずfetch
を使ってみましょうというお話でしたね。
これらの違いを理解した上で状況に応じて適切な方法を選択できると、意図しない結果に混乱することもなくなり、もし間違ったとしても冷静に状況を見れるようになるでしょう。
VSCodeなどではこういったコマンドはワンプッシュでできてしまいますが、慣れるまではテスト用のブランチを使用するなどして手動でコマンドを打って練習してみると良いですね。慣れてきたら徐々に便利な機能を活用していくことで、理解しつつ効率的に作業できるようになっていくはずです。
何度も使っていく中でGitの操作に慣れ、さまざまな便利な機能を使いこなしてスムーズにチーム開発ができるようになりたいですね。
Discussion