深夜2時の「git pull」という罠
深夜2時、本番サーバーで重大なロジックエラーが発生しました。同僚が修正したホットフィックスを至急取り込んでデプロイする必要があります。眠い目をこすりながら、すべてがうまくいくことを願って git pull origin master と急いで打ち込みました。
結果はどうなったでしょうか?画面には「“Automatic merge failed; fix conflicts and then commit the result.”」という真っ赤なエラーメッセージが表示されました。さらに悪いことに、コミット履歴には意味のない「Merge branch…」という行が現れ、せっかく綺麗だったGitのグラフがめちゃくちゃになってしまいました。
このミスのおかげで、混乱を片付けるために貴重な時間をさらに30分も失うことになりました。もしあなたが今でも無意識に git pull を使っているなら、今すぐ立ち止まってください。リポジトリに対して実際には何が行われているのか、一緒に掘り下げていきましょう。
2つのアプローチの比較:慎重派 vs 利便性重視派
どちらのコマンドもリモート(GitHubやGitLabなど)からデータを取得しますが、その処理方法は全く異なります。
1. Git Fetch:安全な「プレビュー」モード
git fetch を実行するのは、新しい新聞を買ってきたけれど、まだ中身を読んでいない状態に似ています。Gitはサーバーと通信して新しいデータをダウンロードしますが、作業ディレクトリ内のファイルは一切変更しません。
git fetch origin
この時、Gitは Remote Tracking Branches(origin/main など)を更新します。ローカルのコードとサーバーのコードをじっくり比較してから、統合するかどうかを判断できます。あなたの淹れたてのコーヒーは安全で、勝手に何かが混ざる心配はありません。
2. Git Pull:便利だがリスクが伴う
実際、git pull は複合的なコマンドです。git fetch を実行した後、自動的に git merge を実行して現在のブランチに変更を取り込みます。
git pull origin main
この便利さは諸刃の剣です。もし双方のコードに差異がある場合、Gitは即座にコンフリクトの解消を迫ります。変更内容が自分の書いている機能にどう影響するかを事前に確認する機会を失ってしまうのです。
なぜシニアエンジニアはGit Fetchを選ぶのか?
履歴の完全なコントロール
git log HEAD..origin/main というコマンドを使うことで、自分のマシンに取り込まれようとしているコミットを正確に確認できます。不意打ちもパニックもありません。
Gitグラフの「蜘蛛の巣」化を防ぐ
かつて私が管理していた8人のチームでは、git pull の乱用により毎週数十件もの不要なマージコミットが発生していました。これにより、Gitのグラフはまるで絡まった糸のようになっていました。fetch を使えば、rebase を選択して履歴を一本の直線に保つことができます。
実プロジェクトでの標準的なワークフロー
コードを綺麗に保つために、以下の2つのプロセスを採用することをお勧めします。
ケース1:コミット履歴を綺麗に保ちたい場合(Clean History)
fetch と rebase を組み合わせて使用します。この方法により、自分のコミットは常にサーバー側と同じ一直線上に配置されます。
git fetch origin
git rebase origin/main
あるいは、短縮コマンド git pull --rebase origin main を使います。私のチームでは、この習慣によって無駄なマージコミットを70%削減できました。
ケース2:統合前にしっかり確認したい場合
これは重要なタスクをこなす際や、サーバーの状態がデリケートな時に必須のプロセスです:
git fetch origin:最新情報を更新する。git diff main origin/main:各行のコードを詳細に比較する。git merge origin/main:すべてが問題ないと確信した時だけ統合する。
Diverged History(履歴の分岐)への対処法
“Your branch and ‘origin/main’ have diverged” という通知は、ローカルとリモートの両方に新しいコミットがある場合に表示されます. 焦らず冷静に対処しましょう:
ステップ1: git fetch origin で最新情報を取得する。
ステップ2: git log --oneline --graph --all で状況を確認する。
ステップ3: 差異を解消する. 履歴を綺麗にしたい場合は git rebase origin/main を選択します. 統合の跡を残したい場合は git merge origin/main を選択します。
プロのためのちょっとしたコツ
pull時に常にrebaseを優先するようにGitを設定しておけば、入力の手間が省けます:
git config --global pull.rebase true
この設定を適用してから、チーム内での不条理なコンフリクトが激減しました。コミットグラフもプロフェッショナルに見え、デバッグも格段にしやすくなりました。
最後に
「git fetch は見るため、git pull は取得して統合するため」とシンプルに覚えましょう。プロフェッショナルな環境では、ソースコードに何を取り込もうとしているのかを正確に把握することが不可欠です。一時の怠慢で一日の努力を台無しにしないでください。ゆっくりfetchし、ログを確認してから、次のステップを決めましょう。

