早めの結論
dev から feat ブランチを切って作業しており,
feat の変更内容を dev にマージしたいとします
-
fast-forwardマージ(早送りマージ)-
devで変更が無かったマージ -
featブランチの変更内容をdevの後に付け加えられるマージ - 卵が先で鶏はいないの
-
-
no-fast-forwardマージ(3-wayマージ)-
devに変更があったマージ -
featの変更内容を取り込みましたよっていうコミット(マージコミット)が作られる - マージコミットがあるので,変更がどっから切ったブランチのやつだったかが分かる
- 鶏が先で卵が後
-
-
squashマージ(スカッシュマージ)-
devに変更があったマージ -
devとfeatの変更を一つのコミットにまとめる(マージコミットを作らない) - マージコミットが無いので,変更がどっから切ったブランチのやつだったかは分からない
- 鶏が先で,卵はいないように見えるが実はいつの間にかいたの
-
fast-forward マージ(早送りマージ)
前提
dev ブランチから feat ブランチを切ってそこで chiken.txt を作成(B)
feat で作業している最中に dev ブランチは特に変更されていない
この状況で dev ブランチに feat ブランチをマージしたい
マージ
# git merge --ff-only {取り込みたいブランチ名}
git merge --ff-only feat
素直に A の後に B がくっつきます
ログ
一本のきれいなログになっています
no-fast-forward マージ(3-wayマージ)
前提
dev ブランチから feat ブランチを切ってそこで chiken.txt を作成(B)
feat で作業している最中に dev ブランチで egg.txt が作成される(C)
この状況で dev ブランチに feat ブランチをマージしたい
マージ
# git merge --no-ff {取り込みたいブランチ名}
git merge --no-ff feat
dev ブランチに feat ブランチの変更内容を取り込んだよという
マージコミット(M)が作られます
変更がどのブランチから切られたブランチでの変更なのかがわかります
ログ
squash マージ(スカッシュマージ)
前提
no-fast-forward マージと同じです
マージ
# git merge --squash {取り込みたいブランチ名}
git merge --squash feat
feat ブランチの変更内容(B)がしれっと dev ブランチに取り込まれます
ログ
fast-forward の時のようにきれいな一本のログになります








