Slide 1

Slide 1 text

あの日行ったマージの仕組みを 僕達はまだ知らない。 開発部 鎗水

Slide 2

Slide 2 text

最近、開発部内で「squash mergeはしない方がいい」「リリース ブランチにマージする時はrebaseしたい」などマージが話題に上 がることが何度かあった。 背景

Slide 3

Slide 3 text

そもそも、ブランチはどうやってマージされるのか?

Slide 4

Slide 4 text

その前に・・・

Slide 5

Slide 5 text

コミットの話をします!

Slide 6

Slide 6 text

なぜか?

Slide 7

Slide 7 text

マージと呼んでいるそれは マージ+コミット だからです 実は、コンフリクトすることなくマージが成功したら 自動的にコミットしてくれている

Slide 8

Slide 8 text

gitのコミット履歴はどのように管理されているのか? コミットの仕組み ファイルのdiffを保存している?

Slide 9

Slide 9 text

違います

Slide 10

Slide 10 text

変更されたファイルとファイル情報をまるごと git上のデータベースに保存して管理する方法 スナップショットとして管理している

Slide 11

Slide 11 text

1. A1、B1、C1のスナップショットがVer.1として保存される A1 C1 B1 Ver.1

Slide 12

Slide 12 text

1. A1、B1、C1のスナップショットがVer.1として保存される 2. 変更されたファイルA2、B2がVer.2として保存される a. C1は変更がないのでそのままVer.2から参照される A1 C1 B1 Ver.1 A2 C1 B2 Ver.2

Slide 13

Slide 13 text

1. A1、B1、C1のスナップショットがVer.1として保存される 2. 変更されたファイルA2、B2がVer.2として保存される a. C1は変更がないのでそのままVer.2から参照される 3. 変更されたファイルA3、C2がVer.3として保存される a. B2は変更がないのでVer.3から参照される A1 C1 B1 Ver.1 A2 C1 B2 Ver.2 A3 C2 B2 Ver.3

Slide 14

Slide 14 text

マージは状況に応じて2つの方法が取られます マージの仕組み

Slide 15

Slide 15 text

1. mainブランチからfeatureブランチを切る ケース1:fast-forward マージ先ブランチがマージ元ブランチとの共通コミットから先に進んでいない場合 A C B main feature

Slide 16

Slide 16 text

1. mainブランチからfeatureブランチを切る 2. D、E、Fの変更がコミットされる ケース1:fast-forward マージ先ブランチがマージ元ブランチとの共通コミットから先に進んでいない場合 A C B D F E main feature

Slide 17

Slide 17 text

ケース1:fast-forward マージ先ブランチがマージ元ブランチとの共通コミットから先に進んでいない場合 main A C B D F E feature 1. mainブランチからfeatureブランチを切る 2. D、E、Fの変更がコミットされる 3. featureブランチをmainブランチにマージする a. mainブランチのポインタをfeatureブランチの位置に移動する

Slide 18

Slide 18 text

ケース1:fast-forward マージ先ブランチがマージ元ブランチとの共通コミットから先に進んでいない場合 main A C B D F E feature 1. mainブランチからfeatureブランチを切る 2. D、E、Fの変更がコミットされる 3. featureブランチをmainブランチにマージする a. mainブランチが分岐点から先に進んでいないか確認する b. 進んでいなければmainブランチのポインタをfeatureに移動する

Slide 19

Slide 19 text

1. mainブランチからfeatureブランチが切られる ケース2:3way merge マージ先ブランチがマージ元ブランチとの共通コミットから先に進んでいる場合 A C B main feature

Slide 20

Slide 20 text

1. mainブランチからfeatureブランチが切られる 2. D、E、Fの変更がコミットされる ケース2:3way merge マージ先ブランチがマージ元ブランチとの共通コミットから先に進んでいる場合 A C B D F E main feature

Slide 21

Slide 21 text

ケース2:3way merge マージ先ブランチがマージ元ブランチとの共通コミットから先に進んでいる場合 A C B D F E feature 1. mainブランチからfeatureブランチが切られる 2. D、E、Fの変更がコミットされる 3. mainブランチに変更を加えコミットする G main

Slide 22

Slide 22 text

ケース2:3way merge マージ先ブランチがマージ元ブランチとの共通コミットから先に進んでいる場合 A C B D F E feature 1. mainブランチからfeatureブランチが切られる 2. D、E、Fの変更がコミットされる 3. mainブランチに変更を加えコミットする 4. featureブランチをmainブランチにマージする a. mainブランチの差分(C-Gの差分)とfeatureブランチの差分(C-Fの差分)を求める b. 2つの差分がコンフリクトしていなければfeatureブランチの差分をmainブランチにコミットする i. ただし、共通している行はコミットから除外される G main G

Slide 23

Slide 23 text

マージはマージ元のブランチを削除しても履歴は残る

Slide 24

Slide 24 text

これはメリットでありデメリットである

Slide 25

Slide 25 text

なぜか?

Slide 26

Slide 26 text

開発を進めるにつれてブランチは複雑化していく 複雑化したコミットツリー

Slide 27

Slide 27 text

リベースならコミットツリーを シンプルにできる!!

Slide 28

Slide 28 text

1. mainブランチからfeatureブランチが切られる リベースの仕組み A C B main feature

Slide 29

Slide 29 text

1. mainブランチからfeatureブランチが切られる 2. D、E、Fの変更がコミットされる A C B D F E main feature

Slide 30

Slide 30 text

A C B D F E feature 1. mainブランチからfeatureブランチが切られる 2. D、E、Fの変更がコミットされる 3. mainブランチに変更を加えコミットする G main

Slide 31

Slide 31 text

1. mainブランチからfeatureブランチが切られる 2. D、E、Fの変更がコミットされる 3. mainブランチに変更を加えコミットする 4. featureブランチをmainブランチにリベースする a. mainブランチの差分(C-Gの差分)とfeatureブランチの差分(C-Fの差分)を求める b. 2つの差分を一時ファイルに保存する c. mainブランチと同じ位置に移動し、featureブランチの差分を順番にコミットする A C B D’ F’ E’ G main experiment

Slide 32

Slide 32 text

1. mainブランチからfeatureブランチが切られる 2. D、E、Fの変更がコミットされる 3. mainブランチに変更を加えコミットする 4. featureブランチをmainブランチにリベースする a. mainブランチの差分(C-Gの差分)とfeatureブランチの差分(C-Fの差分)を求める b. 2つの差分を一時ファイルに保存する c. mainブランチと同じ位置に移動し、featureブランチの差分を順番にコミットする d. mainブランチをfast-forward mergeする A C B D’ F’ E’ G experiment main

Slide 33

Slide 33 text

注意点 ● PRレビュー中にリベースするとレビューが消える ● どこまでがどの作業のコミットログか分かりにくくなる ● 公開リポジトリにプッシュしたコミットをリベースしてはいけない ○ 同じブランチでの作業者に影響が出る ○ この指針に従っている限り、すべてはうまく進みます。 もしこれを守らなけ れば、あなたは嫌われ者となり、友人や家族からも軽蔑されることになるで しょう。 by git公式

Slide 34

Slide 34 text

- 3.2 Git のブランチ機能 - ブランチとマージの基本 - 3.6 Git のブランチ機能 - リベース - 【git】マージを理解する - ブランチのお供に!! - 【Git】Gitのコミットの裏側で何が起きているのか(スナップショットとは何?) 参考文献