Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
あの日行ったマージの仕組みを僕達はまだ知らない。
Search
toridori
October 01, 2024
0
220
あの日行ったマージの仕組みを僕達はまだ知らない。
toridori
October 01, 2024
Tweet
Share
More Decks by toridori
See All by toridori
Locustでmacから開発環境に負荷試験をしてみた
toridori_dev
0
79
N + 1 問題の概要と Railsにおける解決方法
toridori_dev
0
73
Aurora Cloneで QA環境をつくってみた
toridori_dev
0
110
ニューモーフィズムってどうなの
toridori_dev
0
200
toridori base webをv0で爆速で作った話
toridori_dev
0
130
ハイパーパラメータチューニングって何をしているの
toridori_dev
0
230
KoT APIでプチ業務改善を試してみた
toridori_dev
0
200
MUI DataGridProコンポーネントの紹介
toridori_dev
0
420
DBマイグレーションとORMについて
toridori_dev
0
190
Featured
See All Featured
Site-Speed That Sticks
csswizardry
3
370
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.4k
Docker and Python
trallard
44
3.3k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
49
2.3k
For a Future-Friendly Web
brad_frost
176
9.5k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Designing for humans not robots
tammielis
250
25k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Rails Girls Zürich Keynote
gr2m
94
13k
YesSQL, Process and Tooling at Scale
rocio
171
14k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
30
4.6k
Transcript
あの日行ったマージの仕組みを 僕達はまだ知らない。 開発部 鎗水
最近、開発部内で「squash mergeはしない方がいい」「リリース ブランチにマージする時はrebaseしたい」などマージが話題に上 がることが何度かあった。 背景
そもそも、ブランチはどうやってマージされるのか?
その前に・・・
コミットの話をします!
なぜか?
マージと呼んでいるそれは マージ+コミット だからです 実は、コンフリクトすることなくマージが成功したら 自動的にコミットしてくれている
gitのコミット履歴はどのように管理されているのか? コミットの仕組み ファイルのdiffを保存している?
違います
変更されたファイルとファイル情報をまるごと git上のデータベースに保存して管理する方法 スナップショットとして管理している
1. A1、B1、C1のスナップショットがVer.1として保存される A1 C1 B1 Ver.1
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
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
マージは状況に応じて2つの方法が取られます マージの仕組み
1. mainブランチからfeatureブランチを切る ケース1:fast-forward マージ先ブランチがマージ元ブランチとの共通コミットから先に進んでいない場合 A C B main feature
1. mainブランチからfeatureブランチを切る 2. D、E、Fの変更がコミットされる ケース1:fast-forward マージ先ブランチがマージ元ブランチとの共通コミットから先に進んでいない場合 A C B D
F E main feature
ケース1:fast-forward マージ先ブランチがマージ元ブランチとの共通コミットから先に進んでいない場合 main A C B D F E feature
1. mainブランチからfeatureブランチを切る 2. D、E、Fの変更がコミットされる 3. featureブランチをmainブランチにマージする a. mainブランチのポインタをfeatureブランチの位置に移動する
ケース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に移動する
1. mainブランチからfeatureブランチが切られる ケース2:3way merge マージ先ブランチがマージ元ブランチとの共通コミットから先に進んでいる場合 A C B main feature
1. mainブランチからfeatureブランチが切られる 2. D、E、Fの変更がコミットされる ケース2:3way merge マージ先ブランチがマージ元ブランチとの共通コミットから先に進んでいる場合 A C B
D F E main feature
ケース2:3way merge マージ先ブランチがマージ元ブランチとの共通コミットから先に進んでいる場合 A C B D F E feature
1. mainブランチからfeatureブランチが切られる 2. D、E、Fの変更がコミットされる 3. mainブランチに変更を加えコミットする G main
ケース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
マージはマージ元のブランチを削除しても履歴は残る
これはメリットでありデメリットである
なぜか?
開発を進めるにつれてブランチは複雑化していく 複雑化したコミットツリー
リベースならコミットツリーを シンプルにできる!!
1. mainブランチからfeatureブランチが切られる リベースの仕組み A C B main feature
1. mainブランチからfeatureブランチが切られる 2. D、E、Fの変更がコミットされる A C B D F E
main feature
A C B D F E feature 1. mainブランチからfeatureブランチが切られる 2.
D、E、Fの変更がコミットされる 3. mainブランチに変更を加えコミットする G main
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
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
注意点 • PRレビュー中にリベースするとレビューが消える • どこまでがどの作業のコミットログか分かりにくくなる • 公開リポジトリにプッシュしたコミットをリベースしてはいけない ◦ 同じブランチでの作業者に影響が出る ◦
この指針に従っている限り、すべてはうまく進みます。 もしこれを守らなけ れば、あなたは嫌われ者となり、友人や家族からも軽蔑されることになるで しょう。 by git公式
- 3.2 Git のブランチ機能 - ブランチとマージの基本 - 3.6 Git のブランチ機能
- リベース - 【git】マージを理解する - ブランチのお供に!! - 【Git】Gitのコミットの裏側で何が起きているのか(スナップショットとは何?) 参考文献