ファイルのマージのみを行い、Gitによるマージ処理を行わない
ファイルのマージのみを行い、Gitによるマージ処理を行いません。通常「Git」のマージは、以下のような流れになります。
- ファイルの差分を作成する
- ファイルの差分をマージする
- マージコンフリクトが発生したら、マージを中断してユーザーにマージコンフリクトの解消を促す
- マージコンフリクトが発生しなかったら、マージコミットを行う
- マージ後のコミットオブジェクトは、マージしたコミットオブジェクトを親コミットオブジェクトに持つ
Gitによるマージ処理とマージの管理
「マージコンフリクト」の発生によりマージを中断した場合、「Git」は「マージコンフリクト」の発生により、マージが中断されている状態を認識します。この状態は、「マージコンフリクト」を解消しコミットするか、ユーザーがマージを中止しない限り、解消されません。
また、マージ後の「コミットオブジェクト」は、マージした「コミットオブジェクト」を「親コミットオブジェクト」に持つように設定されます。
例えば、3つのブランチをマージした場合、マージ後の「コミットオブジェクト」の「親コミットオブジェクト」は、3つ存在します。
これら一連の処理は、「Git」がマージの状態や結果を管理し、「Git」のマージ処理の管理下で行われています。
ファイルのマージのみを行い、Gitによるマージ処理を行わない
上記のマージ処理のうち、「1.」〜「2.」の処理のみ、利用することもできます。すなわち、ファイルのマージのみ行います。
これは「Git」から見ると、マージではありません。
従って「マージコミット」は行われませんし、「マージコンフリクト」が発生しても、マージとして認識していないため、マージの中止は行えません。
これは、ユーザーが自分で「ワーキングディレクトリー」内のファイルに対し、別の「スナップショット」のファイルを手動でマージした状態と同じです。
またマージではないため、「他のブランチとマージした」など、マージに関する情報も、一切保持されません。
この方法を利用すると、マージを行うことなく、他の「コミットオブジェクト」のファイル群とファイルのマージを行うことができます。
ファイルの差分を取り込むイメージです。
コミットは自分で行う
ファイルのマージ後にコミットは行われないため、ユーザーは自分でコミットする必要があります。コマンドの実行例
コマンドの実行例です。1.ブランチの確認
現在のブランチ構成を確認すると、以下のようになっています。現在のブランチは、「master」ブランチであることが分かります。
同様に、「HEAD」は「master」ブランチを指していることが分かります。
ここでは例として、「master」ブランチに「fix」ブランチをマージします。
2.ブランチの状態
ブランチの状態を図にすると、以下のようになります。見ての通り、この状態で「master」ブランチに「fix」ブランチをマージすると、「3ウェイマージ」によるマージになることが分かります。
ただしマージは、ファイルのマージのみ行われます。
3.コマンドの実行
コマンドのオプションは、以下のオプションを指定します。オプション |
---|
--squash |
「端末」から、以下のコマンドを実行します。
コマンドの詳細は、「ファイルのマージを行うコマンドの説明」を参考にしてください。
ポイントは、赤字の箇所です。
git merge --squash --verbose fix
4.コマンドの実行結果
ファイルのマージのみ行われます。もし「マージコンフリクト」が発生した場合、その旨が出力されます。
5.マージ後のワーキングディレクトリーの確認
マージ後の「ワーキングディレクトリー」を確認すると、以下のようになっています。「fix」ブランチにあった「file2.txt」が新規に追加されたファイルとして認識され、「ステージングエリア」に追加されています。
今回の例では存在しませんが、「マージコンフリクト」が発生しなかった編集されたファイルも、「ステージングエリア」に追加されます。
「マージコンフリクト」が発生したファイルは、「コンフリクトマーカー」が挿入されます。
ユーザーは必要な編集を行います。
6.マージ後のブランチの確認
マージ後のブランチを確認すると、以下のようになっています。「1.」の状態と同じです。
「1.」の状態と比較すると、「ワーキングディレクトリー」内のファイル構成やファイルの内容が、マージにより更新されている状態です。
7.コミットを行う
コンフリクトの解消など、必要な作業を行ったらコミットします。8.コミット後のブランチの確認
コミット後のブランチを確認すると、以下のようになっています。「master」ブランチのブランチヘッドが指す「コミットオブジェクト」の識別子は、「7.」のコミットで生成した「コミットオブジェクト」を指しています。