お題 git pullとgit fetchとgit mergeの違い
ソースツリーでプッシュ・プルをするようになってからコマンドでのgitをさっぱり触らなくなりました。
ソースツリー、GUI上で触れるって優しいし便利ですよね。エンジニア歴が3年たった今もお世話になっています。
ですが入社後ずっと触っていくうちに、あれ?ソースツリーあるならgitの操作はこれ以上覚えなくてよくね?
みたいな惰性が生まれ始め、さっぱり覚えずにここまで来てしまったことを心より恥じます。
そして今週、ちょうどソースツリーが認証上の不具合でプルもプッシュもできない状態になり
コマンド上のgit操作を余儀なくされました。
ちょうどgitの操作をおさらいをしたかったのでまあいいか!なんて少し軽率なことを考えていました。
この際に自分が疑問に思ってたことをまとめました。
まず、今自分がこれなんだろう?どうやってつかうんだろう?と疑問に思っているのがgit pullと
git fetchとgit merge。いずれもgitのコマンドですが、何をしたいかはソースツリーでも馴染みがあるので
なんとなくは分かるのですが中で何をしているかは不明瞭。
という訳で調べてみました。↓
git fetchはリモートから最新の更新をローカルに引っ張ってくる。
直接「develop」ブランチに引っ張ってくるのではなく「origin/develop」というブランチに取り込まれます。
このorigin/developブランチはローカル上にある、リモート上のdevelopを追跡するためのブランチになります。
「今リモートリポジトリはここまで進んでいるよ!」と教えてくれるマメなコマンドと思ってください。
例えば、AさんとBさんがリモートリポジトリからそれぞれのローカルリポジトリにファイルを取得したとして
Bさんはローカル上にあるapple.jsというファイルを変更しプッシュしました。ところがAさんもapple.jsの値を変えていたとします。
もしこれをそのままプルしようとすると修正したファイルが被りコンフリクトが起きてしまいます。
git fetchはプル前に情報をブランチに渡して確認することでコンフリクトを防ぐ役割を持っています。
そこからログやgitの履歴を見てどのコードを変更したか確認することができます。
実際にdevelopブランチに取り込むにはgit mergeを使います。このgit fetchとgit mergeをまとめたものが
git pullというコマンドです。git pullはfetchで履歴を確認せず有無を言わさずにマージをするコマンドです。
開発者が少ない時にはこっちのほうが楽ですが、開発者が複数かつプロジェクトが大きい場合はほぼ確実にコンフリクトが
おきる元凶と化すのでテスト時でない限りは使わない方が吉。
コマンド上では基本的にgitコマンドを打つ前にリモートリポジトリがどんな状況か常時見ないといけないので
基本はgit fetch + git mergeで開発を進めます。
git fetchとgit margeとgit pullの違いは以上になります。
上記の理由で今後もコマンド中心になるので、また新しい発見がありましたら随時載せていきたいと思います。