git pull vs fetch
git pull の特徴
git pull = git fetch + git merge
チェックアウト中のローカルブランチ(LB)に対し、リモートブランチ(RB)から取得した変更をマージする
引数なしで実行すると、追跡関係に基づいて自動でリモートとローカルがマージされる
git fetch の特徴
すべてのリモートブランチの情報をローカル追跡ブランチ(RTB)に取得するが、ローカルブランチには影響しない
git pull 前に現在の状況を把握するのに使える
push 前にリモートとローカルの差分を確認する用途にも便利
💬 自分の感想:
fetch + git status で対応するリモートブランチを正しく追跡できているか確認できるので、基本的に fetch のほうが安全そう。
git merge vs rebase
merge の特徴
3-way マージ(通常のマージ)と Fast-Forward マージの2種類がある
履歴が分岐している場合、マージコミットが生成される(3-way マージ)
3-wayマージでは、共通の親を基点に両方のブランチの差分を統合し、新たなマージコミットが生成される。
FFマージでは、対象ブランチが現在のブランチに直列に並んでいるとき、単にポインタを進めるだけ(マージコミットは生成されない)。
・強み:
変更の実態が正確に残るため、履歴から変更内容を追いやすい
rebase の特徴
分岐していたコミット履歴を直線的に改変する
共有のブランチと分岐間の変更を再適用(リプレイ)するための新しいコミットを作成する
結果的に、新しいブランチはその再適用されたコミット群の先端を指す
・強み:
コミット履歴がキレイになる(直線的)
・ 弱み:
リモート/ローカル間の不整合を起こしかねない
💬 自分の感想:
履歴に手を加えることに違和感があるので、merge の方が好き。
シンプルに履歴の不整合が起こるのも怖い。