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
200
あの日行ったマージの仕組みを僕達はまだ知らない。
toridori
October 01, 2024
Tweet
Share
More Decks by toridori
See All by toridori
ニューモーフィズムってどうなの
toridori_dev
0
130
toridori base webをv0で爆速で作った話
toridori_dev
0
92
ハイパーパラメータチューニングって何をしているの
toridori_dev
0
200
KoT APIでプチ業務改善を試してみた
toridori_dev
0
130
MUI DataGridProコンポーネントの紹介
toridori_dev
0
340
DBマイグレーションとORMについて
toridori_dev
0
170
Featured
See All Featured
Java REST API Framework Comparison - PWX 2021
mraible
28
8.3k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
Into the Great Unknown - MozCon
thekraken
33
1.5k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Embracing the Ebb and Flow
colly
84
4.5k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Designing Experiences People Love
moore
138
23k
Facilitating Awesome Meetings
lara
50
6.1k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Code Reviewing Like a Champion
maltzj
521
39k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
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のコミットの裏側で何が起きているのか(スナップショットとは何?) 参考文献