背景
mergeのfast-forwardとnon-fast-forwardをなんとなく行ってきたので、
明確に覚えたいため調査した。
目的
どのような時がfast-forwardになり、どのような時がnon-fast-forwardになるか理解する。
結論
マージ元のブランチに修正が
ないとき → fast-forward
あるとき → non-fast-forward
※ 実際の業務の例だと、マージ元のブランチ(masterなど)からfeatureブランチを切ったときに、origin/masterに他の人から修正がない場合、ある場合ということ。
検索して調べた内容
fast-forward:早送りマージ
- git mergeするとデフォルトでfast-forwardになる。
git merge --ff feature
- fast-forward-mergeが可能なのは、現在のブランチが他のブランチの履歴の延長線上にある場合のみ。この場合、現在のブランチのポインタを他のブランチの最新コミットに移動するだけでマージが完了する。
non-fast-forward
- commitオブジェクトを作成する
- マージ元のブランチ(master、developなど)に変更があるときに実行される
git merge --no-ff feature
gitで実践
featureブランチをdevelopブランチにマージしたい、という前提で確認。
fast-forward
fast-fowardはマージ元のブランチに変更がない時に使用する。
gitgraph fast-forward-merge前
gitgraph fast-forward-merge後
画像の通り、developのbranchリファレンスが移動するだけとなっている。
non-fast-forward マージ元のブランチに変更があり
↓ deveop に feature-1 を non-fast-forward merge
画像の通り、新しいコミットオブジェクトを作成し、developリファレンスが移動することで、mergeされている。feature側のブランチがそのまま残るため、featureを確認しやすい。
non-fast-forward マージ元のブランチに変更がなし(実際はほぼない)
通常fast-forward mergeできるところで、non-fast-forward mergeを行ってみた。
画像の通り、新しいコミットオブジェクトを作成している。
最後のmergeコミットは、feature-1ブランチで加えられた hello_world add 2,3,4の内容を、
developに取り込む内容となっている。
学び
- fast-foward merge : 新しくcommitオブジェクトを作成せず、リファレンスを移動させるだけのため、早送りマージと呼ばれる。developはfeatureと同じ履歴を辿る。
- non-fast-forward merge : 新しくcommitオブジェクトを作成する。featureの内容を最後にまとめてdevelopに加えている。
次のアクション
git revert も同様に調べる。
コンフリクト時のgitの動きも知りたい。