0
0

git fast-forward、non-fast-forwardの違い

Last updated at Posted at 2024-09-19

背景

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が可能なのは、現在のブランチが他のブランチの履歴の延長線上にある場合のみ。この場合、現在のブランチのポインタを他のブランチの最新コミットに移動するだけでマージが完了する。
    image.png

non-fast-forward

  • commitオブジェクトを作成する
  • マージ元のブランチ(master、developなど)に変更があるときに実行される
git merge --no-ff feature

gitで実践

featureブランチをdevelopブランチにマージしたい、という前提で確認。

fast-forward

fast-fowardはマージ元のブランチに変更がない時に使用する。

gitgraph fast-forward-merge前
image.png
gitgraph fast-forward-merge後
image.png

画像の通り、developのbranchリファレンスが移動するだけとなっている。

non-fast-forward マージ元のブランチに変更があり

image.png
↓ deveop に feature-1 を non-fast-forward merge
image.png

画像の通り、新しいコミットオブジェクトを作成し、developリファレンスが移動することで、mergeされている。feature側のブランチがそのまま残るため、featureを確認しやすい。

non-fast-forward マージ元のブランチに変更がなし(実際はほぼない)

通常fast-forward mergeできるところで、non-fast-forward mergeを行ってみた。

image.png

画像の通り、新しいコミットオブジェクトを作成している。
最後の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の動きも知りたい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0