Gitで、コミット
- 不変である、
- そして有向非巡回グラフを形成します。
スカッシュはコミットを結合しません。代わりに、他の複数のコミットからの変更を含む新しいコミットを記録します。リベースも同様ですが、コミットを結合しません。既存のコミットと同じ変更で新しいコミットを記録することを履歴の書き換えと呼びます。しかし、既存のコミットは不変なので、これは「代替の履歴を書く」と理解されるべきです。
マージは、共通の祖先コミットから始まる2つのコミットの履歴(ブランチ)の変更を結合しようとします。
それでは、履歴を見てみましょう。
F feature2
/
1---2---3---4---5 feature1 (old)
/
-o---o---o---A---o---o---S master
Aは共通の祖先、1〜5は元の機能ブランチ、Fは新しい機能ブランチ、Sは1〜5と同じ変更を含むスカッシュコミットです。ご覧のとおり、FとSの共通の祖先はAです。gitに関する限り、Sと1–5の間に関係はありません。したがって、マスターを一方の側でSとマージし、feature2をもう一方の側で1〜5とマージすると競合します。これらの競合を解決することは難しくありませんが、不必要で退屈な作業です。
これらの制約のため、マージ/スカッシュを処理するための2つのアプローチがあります。
履歴書き換えを使用するか、その場合、同じ変更を表す複数のコミットを取得します。次に、2番目の機能ブランチを押しつぶされたコミットにリベースします。
F feature2 (old)
/
1---2---3---4---5 feature1 (old)
/
-o---o---o---A---o---o---S master
\
F' feature2
または、履歴の書き換えを使用しません。この場合、追加のマージコミットが発生する可能性があります。
F feature2
/
1---2---3---4---5 feature1 (old)
/ \
-o---o---o---A---o---o-----------M master
feature2とmasterがマージされると、共通の祖先はコミット5になります。
どちらの場合も、いくつかのマージ作業があります。この努力は、上記の2つの戦略のどちらを選択するかにあまり依存しません。しかし、それを確認してください
- ブランチは短期間で、マスターブランチからの距離を制限します。
- マスターを機能ブランチに定期的にマージするか、マスターの機能ブランチをリベースしてブランチの同期を維持します。
チームで作業する場合、現在誰が何に取り組んでいるかを調整することが役立ちます。これにより、開発中の機能の数を小さく保つことができ、マージの競合の数を減らすことができます。
feature1
にマスターにスカッシュマージし、feature2
後でマージしたい場合に何が起こるかに取り組んでいないようです。その場合、最初のアプローチでは、gitfeature1
が押しつぶされたコミットの上にコミットを再適用しようとするため、競合が発生しませんか?