Sponsor Link
環境&対象
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 は、リモートの変更を、ローカルのトラッキングブランチに反映するだけ
- トラッキングブランチに反映した変更とローカルとのマージは、手作業
説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。
Sponsor Link