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
170
あの日行ったマージの仕組みを僕達はまだ知らない。
toridori
October 01, 2024
Tweet
Share
More Decks by toridori
See All by toridori
ハイパーパラメータチューニングって何をしているの
toridori_dev
0
100
KoT APIでプチ業務改善を試してみた
toridori_dev
0
65
MUI DataGridProコンポーネントの紹介
toridori_dev
0
240
DBマイグレーションとORMについて
toridori_dev
0
150
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
329
21k
Optimizing for Happiness
mojombo
376
70k
Code Review Best Practice
trishagee
64
17k
Unsuck your backbone
ammeep
668
57k
The World Runs on Bad Software
bkeepers
PRO
65
11k
Teambox: Starting and Learning
jrom
133
8.8k
Navigating Team Friction
lara
183
14k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Facilitating Awesome Meetings
lara
50
6.1k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
126
18k
Become a Pro
speakerdeck
PRO
25
5k
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のコミットの裏側で何が起きているのか(スナップショットとは何?) 参考文献