早めの結論
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
の時のようにきれいな一本のログになります