リベース実行前に編集されたファイルの変更内容を保存し、リベース実行後に編集内容を適用する
リベース実行前に編集されたファイルの変更内容を保存し、リベース完了後に編集内容を適用することができます。この機能は、「スタッシュ(Stash)」を利用しています。
スタッシュとは
スタッシュは、「ワーキングディレクトリー」内の編集されたファイルの変更内容を保存して、編集前の状態に戻します。従って、 「ワーキングディレクトリー」はクリーンな状態になります。(チェックアウト直後の状態)
言い換えると、作業内容の保存です。
後で、保存した変更内容を「ワーキングディレクトリー」内のファイルに適用することができます。
これは差分の適用なので、「マージコンフリクト」が発生する可能性があります。
スタッシュしてからリベースを行う
スタッシュしてからリベースを行うと、現在編集されているファイルの変更内容を、リベース実行前にスタッシュに保存して、リベース完了後に保存した変更内容を「ワーキングディレクトリー」内のファイルに適用することができます。デフォルトでは、リベース実行前にスタッシュは行われません。
従って、「ワーキングディレクトリー」がダーティーな状態でリベースを行おうとすると、以下のようにエラーになります。
コマンドの実行例
コマンドの実行例です。1.ブランチの確認
現在のブランチ構成を確認すると、以下のようになっています。現在のブランチは、「fix」ブランチであることが分かります。
同様に、「HEAD」は「fix」ブランチを指していることが分かります。
ここでは例として、「fix」ブランチを「master」ブランチにリベースし、「mastsr」ブランチに「fix」ブランチの変更内容を結合します。
2.ブランチの構成
現在のブランチの構成を図にすると、以下のようになっています。「fix」ブランチを「master」ブランチにリベースするため、リベース対象の「コミットオブジェクト」は、以下のようになります。
- Commit4
- Commit5
3.ワーキングディレクトリーの状態
現在の「ワーキングディレクトリー」の状態を確認すると、以下のようになっています。「fix.txt」ファイルは、編集されたファイルであることが分かります。
4.コマンドの実行
コマンドのオプションは、以下のオプションを指定します。オプション |
---|
--autostash |
「端末」から、以下のコマンドを実行します。
コマンドの詳細は、「ファイルの変更内容を異なるブランチに結合するコマンドの説明」を参考にしてください。
ポイントは、赤字の箇所です。
git rebase --verbose --autostash master
5.コマンドの実行
以下のように、リベース結果が表示されます。「Created autostash: 34b276c」でスタッシュに変更内容が保存され、リベース完了後に「Applied autostash.」でスタッシュに保存した変更内容を適用していることが分かります。
6.ブランチの確認
現在のブランチ構成を確認すると、以下のようになっています。「fix」ブランチが指す「コミットオブジェクト」の識別子が、「1.」と異なっています。
7.ブランチの構成
現在のブランチの構成を図にすると、以下のようになっています。「Commit4」の変更内容を元に、「Commit4’」が新規に生成されています。
同様に「Commit5」の変更内容を元に、「Commit5’」が新規に生成されています。
8.ワーキングディレクトリーの状態
現在の「ワーキングディレクトリー」の状態を確認すると、以下のようになっています。「fix.txt」ファイルは、編集されたファイルであることが分かります。
マージコンフリクトが発生した時は
スタッシュに保存した変更内容をファイルに適用する際、変更内容によっては、上記の「5.」の時点で「マージコンフリクト」が発生します。1.マージコンフリクトの発生
「マージコンフリクト」が発生すると、以下のように「Applying autostash resulted in conflicts.」と出力されます。2.ワーキングディレクトリーの状態
現在の「ワーキングディレクトリー」の状態を確認すると、以下のようになっています。「master.txt」ファイルは、編集されたファイルであることが分かります。
すでにリベースが完了した後で発生した「マージコンフリクト」であるため、リベースの中止やリベースの続行は行えません。
3.master.txtファイルの中身
「マージコンフリクト」が発生した 「master.txt」ファイルの中身を見てみると、以下のようにコンフリクトが発生した箇所に「コンフリクトマーカー」が挿入されています。「マージコンフリクト」が発生したファイルの中身を修正し、必要に応じてファイルを「ステージングエリア」に追加してください。