Git stashの使い方完全ガイド|コマンド実行例で初心者向け解説

Git

Git stashの使い方完全ガイド|コマンド実行例で初心者向け解説

Gitを使った開発を行っている際、「別のブランチに切り替えたいけど、現在の変更をコミットしたくない」という状況に直面することがあります。このような場面で活躍するのがGit stashです。本記事では、Git stashの基本的な使い方から応用まで、初心者でも理解できるよう詳しく解説します。

目次

1. Git stashが必要な原因の説明

Git stashを理解する前に、どのような場面で必要になるのかを説明します。

1-1. 典型的な問題シーン

開発中に以下のような状況が発生することがあります:

  • 機能Aの開発途中に、緊急のバグ修正が必要になった → 現在の変更を保存して別のブランチに切り替えたい
  • コミット前に別のブランチを確認したい → 変更内容をどこかに保管しておきたい
  • 同じファイルへの複数の変更を管理したい → 変更の一部だけを一時保存したい

こうした場合、コミットしないで変更を一時的に保存できれば、ブランチの切り替えがスムーズになります。

1-2. Git stashとは

Git stashは、現在の作業ディレクトリの変更を一時的に保存(スタッシュ)し、クリーンな状態に戻すGitコマンドです。保存した変更は後で復元することができます。

stashの特徴:

  • 変更をコミットせずに一時保存できる
  • 複数の変更を積み重ねて管理できる
  • ブランチの切り替えがスムーズになる
  • 保存した変更は後でいつでも復元可能

2. Git stashの解決手順

2-1. 基本的な流れ

Git stashを使う基本的な流れは以下の通りです:

  1. 現在の変更を確認する → git status
  2. 変更をスタッシュに保存する → git stash
  3. 別の作業を行う → ブランチ切り替えなど
  4. 保存した変更を復元する → git stash pop

2-2. よく使うコマンド一覧

コマンド 説明
git stash 現在の変更を保存してクリーンな状態に戻す
git stash list 保存されたスタッシュの一覧を表示
git stash pop 最新のスタッシュを復元して削除
git stash apply 最新のスタッシュを復元(削除しない)
git stash drop 最新のスタッシュを削除
git stash show 最新のスタッシュの内容を表示

3. コード例と実践的な使い方

3-1. 基本的な使い方

ステップ1:現在の変更を確認する

$ git status
On branch feature/user-profile
Changes not staged for commit:
  (use \"git add <file>...\" to update the what will be committed)
  (use \"git restore <file>...\" to discard changes in working directory)
        modified:   user.js
        modified:   profile.html

Untracked files:
  (use \"git add <file>...\" to include in what will be committed)
        config.tmp

ステップ2:変更をスタッシュに保存する

$ git stash
Saved working directory and index state WIP on feature/user-profile: abc1234 Add user profile page

このコマンドで、user.jsとprofile.htmlの変更が一時保存されます。注意として、Untracked files(追跡されていないファイル)はデフォルトでは保存されません

ステップ3:スタッシュが保存されたか確認する

$ git status
On branch feature/user-profile
nothing to commit, working tree clean

ワーキングディレクトリがクリーンになりました。

ステップ4:別のブランチに切り替える

$ git checkout hotfix/critical-bug
Switched to branch 'hotfix/critical-bug'

ステップ5:別の作業を完了してから元に戻す

$ git checkout feature/user-profile
Switched to branch 'feature/user-profile'

ステップ6:保存した変更を復元する

$ git stash pop
On branch feature/user-profile
Changes not staged for commit:
  (use \"git add <file>...\" to update the what will be committed)
        modified:   user.js
        modified:   profile.html

Dropped refs/stash@{0} (abcd1234567890)

3-2. 複数のスタッシュを管理する

スタッシュの一覧を表示する

$ git stash list
stash@{0}: WIP on feature/user-profile: abc1234 Add user profile page
stash@{1}: WIP on feature/login: def5678 Implement login form
stash@{2}: WIP on main: ghi9012 Update README

複数のスタッシュがある場合、番号付きで管理されます。

特定のスタッシュの内容を確認する

$ git stash show stash@{1}
 login.js   | 15 +++++++++
 auth.js    | 8 ++----
 2 files changed, 18 insertions(+), 5 deletions(-)

特定のスタッシュの詳細な差分を確認する

$ git stash show -p stash@{1}
diff --git a/login.js b/login.js
index abc1234..def5678 100644
--- a/login.js
+++ b/login.js
@@ -1,5 +1,20 @@
 function login() {
+  const email = document.getElementById('email').value;
+  const password = document.getElementById('password').value;
+
+  if (!email || !password) {
+    alert('Please enter email and password');
+    return;
+  }

特定のスタッシュを復元する

$ git stash pop stash@{1}
On branch feature/login
Changes not staged for commit:
  (use \"git add <file>...\" to update the what will be committed)
        modified:   login.js
        modified:   auth.js

3-3. 応用的な使い方

スタッシュに説明的なメッセージを付ける

$ git stash save \"WIP: user authentication feature\"
Saved working directory and index state On feature/auth: WIP: user authentication feature

後でスタッシュを確認する際に、どのような変更かが一目瞭然になります。

Untracked filesも含めてスタッシュする

$ git stash -u
Saved working directory and index state WIP on feature/user-profile: abc1234 Add user profile page

オプション「-u」または「–include-untracked」を使うと、追跡されていないファイルもスタッシュに含まれます。

ステージされたファイルのみをスタッシュする

$ git add user.js
$ git stash --keep-index
Saved working directory and index state WIP on feature/user-profile: abc1234 Add user profile page

スタッシュを新しいブランチとして復元する

$ git stash branch feature/restored-from-stash stash@{0}
Switched to a new branch 'feature/restored-from-stash'
On branch feature/restored-from-stash
Changes not staged for commit:
  (use \"git add <file>...\" to update the what will be committed)
        modified:   user.js
        modified:   profile.html

このコマンドは、スタッシュをベースに新しいブランチを作成し、変更を自動的に復元します。

3-4. 実務的なシナリオ

シナリオ:チームプロジェクトでの緊急対応

#!/bin/bash
# 現在の作業状況を確認
echo \"=== Current Status ===\"
git status

# 変更をスタッシュに保存
echo \"\\n=== Stashing changes ===\"
git stash save \"Feature: Add payment integration - paused for hotfix\"

# 本番環境用のブランチに切り替え
echo \"\\n=== Switching to main branch ===\"
git checkout main
git pull origin main

# 新しい修正用ブランチを作成
echo \"\\n=== Creating hotfix branch ===\"
git checkout -b hotfix/payment-gateway-issue

# 修正作業を行う(省略)

# 元のブランチに戻る
echo \"\\n=== Returning to feature branch ===\"
git checkout feature/payment

# スタッシュを復元
echo \"\\n=== Restoring stashed changes ===\"
git stash pop

echo \"\\n=== Work resumed ===\"
git status

4. よくある間違いと注意点

4-1. スタッシュの内容をうっかり削除してしまう

問題:git stash popで復元したと思ったら、エラーが発生してスタッシュが削除されてしまった。

解決策:git stash applyを使うことで、スタッシュを削除せずに復元できます。

$ git stash apply stash@{0}
$ git status  # 確認してから削除
$ git stash drop stash@{0}

4-2. Untracked filesが保存されない

問題:新しく作成したファイルが、git stash後に消えてしまった。

解決策:新規ファイルを含める場合は、-u オプションを使用します。

$ git stash -u
$ git stash -u save \"Including untracked files\"

4-3. コンフリクトが発生する

問題:git stash popで復元する際に、コンフリクトエラーが発生した。

$ git stash pop
Auto-merging user.js
CONFLICT (content): Merge conflict in user.js

解決策:コンフリクトを手動で解決してから、コミットします。

$ git status  # コンフリクト内容を確認
$ vim user.js  # ファイルを手動で編集
$ git add user.js
$ git commit -m \"Resolve stash conflict\"

4-4. スタッシュが多すぎて管理できない

問題:時間が経つと、どのスタッシュが何か分からなくなる。

解決策:以下の方法で整理します。

$ git stash list  # 一覧を確認
$ git stash show stash@{0}  # 内容を確認
$ git stash drop stash@{2}  # 不要なものを削除
$ git stash clear  # すべてを削除(慎重に)

4-5. git stash pop vs git stash apply

重要な違い

  • git stash pop:復元後、スタッシュを削除
  • git stash apply:復元後、スタッシュを保持

復元に失敗する可能性がある場合は、applyを使って安全に復元してから、手動でdropすることをお勧めします。

$ git stash apply stash@{0}  # 試しに復元
$ git status  # 確認
$ git stash drop stash@{0}  # 確実に削除

4-6. 古いスタッシュの自動削除

Gitはデフォルトで、30日以上前のスタッシュを自動的に削除します。重要な変更は、必ず復元してコミットするか、ブランチを作成して保存してください。

5. まとめ

Git stashは、開発効率を大幅に向上させることができる便利な機能です。本記事で学んだ要点を整理します:

重要なコマンド

  • git stash:変更を一時保存
  • git stash list:保存状況を確認
  • git stash pop:復元して削除
  • git stash apply:復元して保持
  • git stash drop:スタッシュを削除

ベストプラクティス

  • スタッシュには説明的なメッセージを付ける
  • 新規ファイルがある場合は、-u オプションを使う
  • 重要な変更は、applyで試してから本確定する
  • 長期間保存する場合は、別ブランチを作成する
  • 定期的にスタッシュ一覧を整理する

最終的なアドバイス

Git stashは開発の中断と再開をスムーズにする強力なツールです。しかし、完全な代替手段ではありません。重要な変更は、可能な限り早くコミットするか、ブランチとして保存することをお勧めします。git stashは、短期的な作業中断向けに使用するのが最も効果的です。

この記事で紹介したコマンドと使い方を実践すれば、Gitでの開発がより効率的になるでしょう。ぜひ、プロジェクトで活用してください。

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