$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
あの日行ったマージの仕組みを僕達はまだ知らない。
Search
toridori
October 01, 2024
0
350
あの日行ったマージの仕組みを僕達はまだ知らない。
toridori
October 01, 2024
Tweet
Share
More Decks by toridori
See All by toridori
Locustでmacから開発環境に負荷試験をしてみた
toridori_dev
0
230
N + 1 問題の概要と Railsにおける解決方法
toridori_dev
0
180
Aurora Cloneで QA環境をつくってみた
toridori_dev
0
270
ニューモーフィズムってどうなの
toridori_dev
0
460
toridori base webをv0で爆速で作った話
toridori_dev
0
220
ハイパーパラメータチューニングって何をしているの
toridori_dev
0
420
KoT APIでプチ業務改善を試してみた
toridori_dev
0
480
MUI DataGridProコンポーネントの紹介
toridori_dev
0
700
DBマイグレーションとORMについて
toridori_dev
0
260
Featured
See All Featured
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Visualization
eitanlees
150
16k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
34k
The agentic SEO stack - context over prompts
schlessera
0
550
Facilitating Awesome Meetings
lara
57
6.7k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
0
160
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
0
110
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandezseo
1
1.3k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.3k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
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のコミットの裏側で何が起きているのか(スナップショットとは何?) 参考文献