git stashオプション早見表
Gitでの作業中、こんな「ちょっと困った」状況に陥ったことはありませんか?
- 状況1:「commit内容は
add
済み。でも、このcommitでadd
しない他の変更や新しいファイルが混在してごちゃごちゃ…。このままコミット前のテストを実行して大丈夫だろうか?」 - 状況2:「どうもビルドの調子が悪い…。もしかして
.gitignore
しているキャッシュか何かが悪さをしてる?原因切り分けのため、すべてを一時的に無い状態にしたい!」
「とりあえず git stash
するか…」と思っても、ただの git stash
ではこれらの悩みをスマートに解決できません。
実はこれら、git stash
のオプションを使い分けることで、驚くほど綺麗に解決できるのです。この記事では、あなたの「ちょっと困った」を解決する git stash
の各オプションを、一目でわかる早見表と具体的なシナリオで解説します。
git stash オプション組み合わせ別 挙動比較表
コマンド (git stash push も同様) |
Stagedな変更 | Unstagedな変更 | Untrackedファイル | Ignoredファイル |
---|---|---|---|---|
git stash |
✅ 対象 | ✅ 対象 | ❌ 対象外 | ❌ 対象外 |
git stash -u |
✅ 対象 | ✅ 対象 | ✅ 対象 | ❌ 対象外 |
git stash -k |
❌ (保持) | ✅ 対象 | ❌ 対象外 | ❌ 対象外 |
git stash -k -u |
❌ (保持) | ✅ 対象 | ✅ 対象 | ❌ 対象外 |
git stash -a |
✅ 対象 | ✅ 対象 | ✅ 対象 | ✅ 対象 |
git stash -k -a |
❌ (保持) | ✅ 対象 | ✅ 対象 | ✅ 対象 |
凡例 (Legend)
- ✅ 対象: stashに退避されます。コマンド実行後、作業ディレクトリから一時的に消えます。
- ❌ 対象外: stashに退避されません。コマンド実行後も、そのまま作業ディレクトリに残ります。
- ❌ (保持): stashに退避されず、作業ディレクトリとステージングエリアに変更が残ります。
各オプションの詳しい解説
git stash
(オプションなし)
最も基本的なコマンドです。Gitが追跡しているファイル(tracked files)の変更を退避させます。急な割り込み作業で、とりあえずブランチを切り替える必要がある、といったシンプルな状況で役立ちます。後述する-u
オプションをつけた方が良い状況もありそうです。
git stash -k
(--keep-index
) と git stash -k -u
冒頭の状況1「コミット内容は add
済み。でも、他の変更や新しいファイルが混在している」という、非常によくある悩みを解決します。
まず基本となる -k
オプションは、git add
した変更はそのまま作業ディレクトリに残し、それ以外のUnstagedな変更のみを退避させます。これにより、コミット前のテストやレビューの妨げとなる「ノイズ」を隔離できます。
しかし、現実の開発で発生する「ノイズ」には、作業途中のUntrackedファイル(新しいファイル)が含まれることがほとんどです。
そこで本命となるのが -k
と -u
を組み合わせた git stash -k -u
です。
git stash -k -u
は、Stagedな変更は保持しつつ、Unstagedな変更とUntrackedファイルの両方を退避させます。これにより、コミットしたい変更だけが存在する、完璧にクリーンな状態でテストやレビューに臨むことができ、自信を持ってコミットできます。
「コミット前に一旦クリーンな状態で確認したい」と思ったら、まずは git stash -k -u
を試すのが最も実践的と言えるでしょう。
git stash -a
(--all
)
冒頭の状況2のような特殊なデバッグ場面で輝きます。
このオプションは「考え直したい」というより、「ignored
ファイル自体が悪さをしているのでは?」と疑われる最後の手段として使います。例えば、「自分の環境でだけビルドが失敗する…。もしかして、.gitignore
に登録しているローカルのキャッシュファイルが原因かもしれない」といったケースです。git stash -a
でキャッシュも含めたすべてを退避させることで、リポジトリをクローンした直後と全く同じ状態で動作を試し、原因を切り分けることができます。
応用編:Untrackedファイルだけを退避するには?
これまでの応用ですが、「Untrackedファイルだけを退避させたい!」という場合は、以下の手順で実現できます。
--patch
)
対話形式でstashする (-
Untrackedファイルをadd:
git add <file>
で退避したいファイルをステージングします。 -
対話形式でstash実行:
git stash --patch
を実行します。 -
退避する内容を選択: 変更箇所ごとにstashするか (
y
) しないか (n
) を聞かれるので、先ほどadd
したUntrackedファイルの部分だけy
を選択します。
git stash
を使いこなせば、日々の開発効率が格段にアップします。この早見表があなたの「ちょっと困った」を解決する一助となれば幸いです。
Discussion