🙌

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ファイルだけを退避させたい!」という場合は、以下の手順で実現できます。

対話形式でstashする (--patch)

  1. Untrackedファイルをadd: git add <file> で退避したいファイルをステージングします。
  2. 対話形式でstash実行: git stash --patch を実行します。
  3. 退避する内容を選択: 変更箇所ごとにstashするか (y) しないか (n) を聞かれるので、先ほど add したUntrackedファイルの部分だけ y を選択します。

git stash を使いこなせば、日々の開発効率が格段にアップします。この早見表があなたの「ちょっと困った」を解決する一助となれば幸いです。

Discussion