Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
あの日行ったマージの仕組みを僕達はまだ知らない。
Search
toridori
October 01, 2024
440
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
あの日行ったマージの仕組みを僕達はまだ知らない。
toridori
October 01, 2024
More Decks by toridori
See All by toridori
Locustでmacから開発環境に負荷試験をしてみた
toridori_dev
0
300
N + 1 問題の概要と Railsにおける解決方法
toridori_dev
0
250
Aurora Cloneで QA環境をつくってみた
toridori_dev
0
340
ニューモーフィズムってどうなの
toridori_dev
0
590
toridori base webをv0で爆速で作った話
toridori_dev
0
270
ハイパーパラメータチューニングって何をしているの
toridori_dev
0
520
KoT APIでプチ業務改善を試してみた
toridori_dev
0
680
MUI DataGridProコンポーネントの紹介
toridori_dev
0
1.3k
DBマイグレーションとORMについて
toridori_dev
0
320
Featured
See All Featured
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
280
Documentation Writing (for coders)
carmenintech
77
5.5k
Chasing Engaging Ingredients in Design
codingconduct
0
320
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Ruling the World: When Life Gets Gamed
codingconduct
0
340
Amusing Abliteration
ianozsvald
1
310
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
WCS-LA-2024
lcolladotor
0
830
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
600
Accessibility Awareness
sabderemane
1
220
Bash Introduction
62gerente
615
220k
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のコミットの裏側で何が起きているのか(スナップショットとは何?) 参考文献