【Git】編集内容の退避「スタッシュ」

作業ツリーの編集中の内容をコミットせずに維持したまま
別のブランチに切り替えたいときなどは「スタッシュ」という操作を行います。
この操作を行うと、現在の作業ツリーの編集内容を
リポジトリーの一時領域にしまうことができます。

Linux 知識の要らない Git 講座 目次にもどる

ストーリー

前回までのあらすじ
ビジネスオーナーの A さんはお店で提供するコーヒーの材料を
通常より安く仕入れることができたので、
割引キャンペーンを始めようと考えました。

その頃、 Web ディレクターの B さんはお店のホームページの
新しいバージョンを製作していました。

ビジネスオーナー A さんと Web ディレクター B さん
ビジネスオーナー A さんと Web ディレクター B さん

A さんは B さんに、ホームページの新しいバージョンには
お店のキャンペーン情報も追加してもらうようにお願いしました。

A さんから依頼を受けた B さんは
ホームページにキャンペーン情報の追加を始めました。

お店で提供するコーヒーの材料
お店で提供するコーヒーの材料

その頃、 A さんのもとには予定よりも早くコーヒーの材料が届きました。
A さんは B さんに連絡して、キャンペーン情報の追加は
新しいバージョンだけではなく、今のホームページにも行ってもらうように
お願いしました。

キャンペーン情報を追加しよう

B さんの作業用フォルダーで「feature」ブランチのまま
HTML ファイルを以下のように編集しましょう。
コミットはまだ行いません。

<html lang="ja">
    <head>
        <link rel="stylesheet" href="style.css" type="text/css">
        <title>Cafe First Knowledge | 池袋 カフェ</title>
    </head>
    <body>
        <header>
            学生リフィル無料キャンペーン中! 未知との出会いを応援する 勉強会カフェ 「First Knowledge」 オープン! 営業時間:平日 07:00〜13:00, 18:00〜23:00 / 土日祝 07:30〜21:00
        </header>
        <div id="content" class="flex">
            <div id="store-name" class="flex">
                <div>
                    Welcome to First Knowledge
                </div>
            </div>
            <div id="cursor">
                MAP<br/>
                ▽
            </div>
        </div>
        <iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3851.635889874613!2d139.7119800386807!3d35.73047759908012!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x60188d6f134fd653%3A0x51eb1d42c77222c2!2z44K144Oz44K344Oj44Kk44Oz44K344OG44Kj!5e0!3m2!1sja!2sjp!4v1567612627721!5m2!1sja!2sjp" width="100%" height="1200" frameborder="0" style="border:0;" allowfullscreen=""></iframe>
        <footer>
            Photo by Marc Mintel on Unsplash
            © First Knowledge Cafe
        </footer>
    </body>
</html>

更新前との差分は以下のようになっているはずです。

更新前との差分 セール情報の追加
更新前との差分 セール情報の追加

そして、ブラウザでの表示は以下のようになっているはずです。

ブラウザの表示 セール情報の追加
ブラウザの表示 セール情報の追加

ここで、この変更は「feature」ブランチではなく
「master」ブランチに適用することになりました。
その場合、現在のブランチを「master」ブランチへ切り替えようとしても
正常に終了しなかった旨のメッセージが表示され、
「master」ブランチへ切り替えることができません。

「master」ブランチへ切り替えることができません
「master」ブランチへ切り替えることができません

作業ツリーに未コミットの変更が残っていて、
ブランチ切り替え時に入れ替わるファイルと同じファイルを変更している場合、
ブランチの切り替えはできません。
(たとえ更新した行が異なっていても、ファイルが同じだとできません。)

この例の場合は、「master」ブランチへの切り替えによって
index.html が入れ替わりますが、 index.html は変更中のため
ブランチの切り替えができませんでした。

このような場合は Git リポジトリーの一時領域に
作業ツリーの変更を退避させ、
ブランチ切り替え後にその変更を再度呼び出して戻します。

変更内容を一時領域に退避させよう

手順

1. [作業ツリーの変更] を右クリック → [Stash changes]
[作業ツリーの変更] を右クリック → [Stash changes]
[作業ツリーの変更] を右クリック → [Stash changes]
2. [OK] ボタンをクリック

どのような編集内容だったか忘れないように、
[スタッシュメッセージ] に編集内容の概要などを入力しておくと良いですが、
今回のように、すぐ呼び出して戻すことがわかっている場合は空で構いません。

[OK] ボタンをクリック
[OK] ボタンをクリック

「成功」と表示されたら処理が正常に完了しています。

「成功」と表示されたら処理が正常に完了しています
「成功」と表示されたら処理が正常に完了しています
3. [閉じる] ボタンをクリック

ログを見ると以下のようになっていることが確認できます。

スタッシュ後のログ
スタッシュ後のログ

ブランチを切り替えよう

手順

1. 「master」ブランチに切り替えます

今度は成功するはずです。

「master」ブランチに切り替えます
「master」ブランチに切り替えます

隠した変更を戻してみよう

手順

1. [stash]を右クリック→[隠した変更を戻す]
[stash]を右クリック→[隠した変更を戻す]
[stash]を右クリック→[隠した変更を戻す]
2. [いいえ] ボタンをクリック
[いいえ] ボタンをクリック
[いいえ] ボタンをクリック

するとログからは「stash」が消えて、
作業ツリーには先ほどの変更が戻った状態になっています。

隠した変更を戻した後のログ
隠した変更を戻した後のログ

HTML ファイルは「master」ブランチの状態に対して
先ほどの変更が適用された状態になっています。

更新前との差分 隠した変更を戻す
更新前との差分 隠した変更を戻す

そして、ブラウザでの表示は以下のようになっています。

ブラウザの表示 隠した変更を戻す
ブラウザの表示 隠した変更を戻す

変更をコミット・プッシュしよう

隠した変更を戻すだけでは、その変更はコミット・プッシュされないので、
最後にコミット・プッシュしましょう。
プッシュまで終えると、ログは以下のようになっているはずです。

コミット・プッシュ後のログ
コミット・プッシュ後のログ

以上でプロジェクトの編集作業の退避の操作を確認しました。
Git ではこの操作を「スタッシュ」 (stash) と言います。

マージやリベースのときと同じように、
隠した変更を戻したときにも競合が発生することがあります。
その場合はマージと同様の手順で競合の解消をします。
なお、競合が発生した場合はスタッシュが残り続けるので
自分で操作してクリアする必要があります。

Linux 知識の要らない Git 講座 目次にもどる

タイトルとURLをコピーしました