[Git] pull と fetch

git

git の pull と fetch の使い方を説明します。

環境&対象

以下の環境で動作確認を行なっています。
git version 2.30.1 (Apple Git-130)

pull と fetch

意味的に似ている pull コマンドと fetch コマンドの意味と使い方を説明します。

pull, fetch いずれも リモートリポジトリに発生した変更を ローカルリポジトリに反映させるためのコマンドです。

つまり どちらのコマンドも、リモートリポジトリとやり取りをしない場合は、不要なコマンドです。

トラッキングブランチ

リモートブランチとやり取りをするリポジトリには、トラッキングブランチという情報が保存されています。

ローカルリポジトリの隠しフォルダ .git 中の config をみて、以下のような記述が確認できれば、そのローカルリポジトリの master は、リモートリポジトリとの関係性を持っています。
そして、そのために トラッキングブランチ情報も保持されています


[remote "origin"]
        url = ssh://.....
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master

pull コマンド

リモートリポジトリに反映された変更を ローカルにも反映するコマンドです。

この場合の反映 は、リモートリポジトリの変更を、ローカルリポジトリに マージ することです。

# コンフリクトが発生し自動で解決できない時にはエラーとなります

リモート側がマスターリポジトリで、ローカルが 自分用の開発リポジトリである時には、pull コマンドで反映してしまって問題ないケースが大半でしょう。

ですが、ローカル側がマスターリポジトリで、リモートが開発者が使用していたリポジトリである時には、そのまま マージしてしまうと問題があるかもしれず、確認していく必要があります。

そのような時に使用するコマンドが、fetch コマンドです。

fetch コマンド

こちらも リモートリポジトリに反映された変更を ローカルにも反映するコマンドです。

この場合の反映は、リモートリポジトリの変更を、ローカルにあるトラッキングブランチに反映することです。(ローカルリポジトリは、変更されません)

pull コマンドの方が便利に見えますが、fetch コマンドを使わないとできないことがあります。

リモートリポジトリに反映された変更と ローカルリポジトリにある(自分でおこなった)変更をどのようにマージするかを選択することです。

単にマージしたいだけかもしれません。

ですが、

ケースによっては、ローカルリポジトリの変更を、新しいリモートリポジトリを使って、rebase するかもしれません。

逆に、ローカルリポジトリを使って、リモートリポジトリの変更を rebase するかもしれません。

このように柔軟に対応するためには、fetch コマンドを活用することが必要となります。

まとめ:pull と fetch の違い

pull と fetch の違い
  • pull は、リモートの変更を ローカルにマージまでしてくれる
  • fetch は、リモートの変更を、ローカルのトラッキングブランチに反映するだけ
  • トラッキングブランチに反映した変更とローカルとのマージは、手作業

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です