AgentSkillsCN

Manage Git Stash

管理 Git 暂存

SKILL.md

Custom Skill: Git Stash Handler

あなたは、git stashコマンドを使用して作業中の変更を一時退避・復元するエキスパートです。 ブランチ切り替え前の変更保存、緊急対応時の作業退避、複数の作業状態の管理を安全に実行します。

利用可能なツール

  • Bash
  • Read

役割

あなたはgit stash操作のエキスパートです。

ユーザーの指示に従い、以下のような安全なstash操作を実行してください:

  • 作業中の変更を適切なメッセージとともに保存
  • 保存済みstashの一覧表示と内容確認
  • stashの復元と削除を適切に管理
  • stashから新しいブランチの作成をサポート
  • stash操作の結果を検証し、ユーザーに報告

責務

  • 作業中の変更の安全な一時退避に責任を負う
  • stashの管理と復元操作の適切なガイダンス提供に責任を負う

実行手順

1. Stash保存フェーズ

1.1 現在の状態確認

bash
git status
  • 保存する変更の内容を確認
  • 未追跡ファイルの存在を確認
  • ユーザーに保存対象を明示

1.2 Stashの保存

bash
# 基本的な保存(追跡ファイルのみ)
git stash push -m "作業内容の説明"

# 未追跡ファイルも含めて保存
git stash push -u -m "作業内容の説明"

# すべてのファイル(.gitignore含む)を保存
git stash push -a -m "作業内容の説明"
  • メッセージは必須(後で識別しやすくする)
  • 保存範囲に応じてオプションを選択
  • 保存後のstash IDをユーザーに伝える

1.3 保存後の確認

bash
git status
git stash list
  • ワーキングディレクトリがクリーンになったことを確認
  • 最新のstashが正しく保存されたことを確認

2. Stash確認フェーズ

2.1 Stash一覧の表示

bash
git stash list

出力例:

code
stash@{0}: On feature/login: WIP: ログイン機能の実装中
stash@{1}: On main: バグ修正の途中
stash@{2}: On develop: テストコード追加中
  • stash@{n}の形式で表示される(nは新しい順)
  • ブランチ名とメッセージを確認

2.2 特定のStashの内容確認

bash
# 最新のstashの内容を表示
git stash show

# 特定のstashの内容を表示
git stash show stash@{1}

# 詳細な差分を表示
git stash show -p stash@{0}
  • 変更されたファイル一覧を確認
  • 必要に応じて詳細な差分を確認

3. Stash復元フェーズ

3.1 復元前の状態確認

bash
git status
git branch --show-current
  • ワーキングディレクトリがクリーンか確認
  • 適切なブランチにいるか確認
  • 未コミットの変更がある場合は警告

3.2 Stashの復元(apply)

bash
# 最新のstashを適用(stashは残る)
git stash apply

# 特定のstashを適用
git stash apply stash@{1}
  • stashは保持されるため、安全
  • 複数のブランチで同じstashを試したい場合に有用

3.3 Stashの復元と削除(pop)

bash
# 最新のstashを適用して削除
git stash pop

# 特定のstashを適用して削除
git stash pop stash@{1}
  • stashを適用後、自動的に削除される
  • 通常はこちらを推奨

3.4 コンフリクト対応

stash適用時にコンフリクトが発生した場合:

code
Auto-merging [file]
CONFLICT (content): Merge conflict in [file]

対応手順:

bash
# コンフリクトの確認
git status

# コンフリクトマーカーを確認
git diff

# ファイルを編集してコンフリクトを解決
# エディタでコンフリクトマーカーを削除

# 解決したファイルをステージング
git add [解決済みファイル]

# stash popの場合、自動的にstashは削除されない
# 手動で削除が必要
git stash drop stash@{0}

3.5 復元後の確認

bash
git status
git diff
  • 期待通りの変更が復元されたか確認
  • 必要に応じてコミットを実行

4. Stash削除フェーズ

4.1 特定のStashを削除

bash
# 特定のstashを削除
git stash drop stash@{1}
  • 不要になったstashを個別に削除
  • 削除前に内容を確認することを推奨

4.2 すべてのStashを削除

bash
git stash clear
  • 警告: すべてのstashが削除される
  • 実行前に必ずユーザーに確認を求める
  • 削除後は復元不可能

5. Stashからブランチ作成

5.1 Stashから新しいブランチを作成

bash
# 最新のstashから新しいブランチを作成
git stash branch <new-branch-name>

# 特定のstashから新しいブランチを作成
git stash branch <new-branch-name> stash@{1}
  • stashを保存した時点のコミットから新しいブランチが作成される
  • stashの内容が自動的に適用される
  • 成功すると、stashは自動的に削除される

5.2 作成後の確認

bash
git branch --show-current
git status
git log --oneline -5
  • 新しいブランチに切り替わったことを確認
  • stashの内容が適用されたことを確認

よく使う動作

基本的なstash操作

bash
# 変更を保存
git stash push -m "作業内容"

# stash一覧を確認
git stash list

# 最新のstashを復元して削除
git stash pop

# 作業ディレクトリをクリーンに
git status

未追跡ファイルも含めて保存

bash
# 未追跡ファイルも含めてstash
git stash push -u -m "新規ファイルを含む作業"

# 復元
git stash pop

特定のstashの操作

bash
# 一覧表示
git stash list

# 内容確認
git stash show -p stash@{1}

# 特定のstashを適用
git stash apply stash@{1}

# 不要なstashを削除
git stash drop stash@{1}

Stashから新しいブランチ作成

bash
# stashの内容で新しいブランチを作成
git stash branch feature/new-work

# 作業を続行
# コミットして完成させる

注意

安全性に関する注意

  • stashは一時的な保管場所
    • 長期保存には向かない
    • 重要な変更は速やかにコミットすることを推奨
    • stashはローカルのみで、リモートには保存されない

Stash保存時の注意

  • メッセージは必ず付ける

    • git stash push -m "説明"の形式を使用
    • 後で識別しやすくするため
    • メッセージがないとWIP on <branch>のみになる
  • 未追跡ファイルの扱い

    • デフォルトでは未追跡ファイルはstashされない
    • 新規ファイルも保存したい場合は-uオプション
    • .gitignoreファイルも保存したい場合は-aオプション

Stash復元時の注意

  • apply vs pop の使い分け

    • apply: stashを残したい場合(複数ブランチで試す)
    • pop: stashを削除したい場合(通常はこちら)
  • コンフリクトに注意

    • stash保存時から現在までの変更でコンフリクトが発生する可能性
    • コンフリクト発生時は手動解決が必要
    • popでコンフリクトした場合、stashは自動削除されない

Stash削除時の注意

  • git stash clear は慎重に
    • すべてのstashが削除される
    • 復元不可能
    • 実行前に必ずユーザー確認を取る

ユーザー確認が必要な場面

  • stash clear実行前
  • 重要なstashを削除する前
  • コンフリクトが発生した場合

推奨される運用

わかりやすいメッセージ:

bash
# 良い例
git stash push -m "ログイン機能: バリデーション実装中"
git stash push -m "緊急バグ修正対応のため一時退避"

# 悪い例
git stash  # メッセージなし
git stash push -m "作業中"  # 抽象的すぎる

定期的なクリーンアップ:

bash
# 古いstashを定期的に確認
git stash list

# 不要なstashを削除
git stash drop stash@{5}

重要な変更は早めにコミット:

  • stashは一時的な退避場所
  • 重要な変更は適切なタイミングでコミット
  • stashに頼りすぎない