Git stashの使い方とは?初心者向け完全ガイド|コード例付き

Git

Git stashの使い方とは?初心者向け完全ガイド

Gitを使っていて、現在の作業を一時的に保存したい、別のブランチに切り替えたいのに変更があるから切り替えられない…そのような場面に直面したことはありませんか?こんなときに便利なのが「Git stash」です。本記事では、Git stashの概念から実践的な使い方まで、初心者でも理解できるように詳しく解説します。

Git stashとは何か?原因の説明

Git stashは、現在の作業ディレクトリの変更を一時的に保存(「スタッシュ」)し、クリーンな状態に戻すための機能です。

どのような場面で必要になるのか

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

  • 機能Aを実装している途中だが、緊急で機能Bの修正が必要になった
  • 別のブランチに切り替えたいが、現在のブランチに未コミットの変更がある
  • コミットする前に別の作業に切り替えたい
  • 現在の変更を保存しておきたいが、まだコミットレディーではない

このような場合、わざわざコミットしてしまうと、履歴が汚れたり、意図しない状態になったりします。そこでGit stashが活躍するのです。

stashの仕組み

stashはGitの特別なスタック構造で、変更を一時的に保存します。複数の変更を保存でき、後から任意のタイミングで復元できます。コミット履歴には影響を与えません。

Git stashの基本的な解決手順

ステップ1:現在の状態を確認する

まず、現在のGitの状態を確認しましょう。

git status

このコマンドで、どのファイルが変更されているか確認できます。

ステップ2:変更をstashに保存する

最も基本的な使い方です:

git stash

このコマンドで、現在の未コミット変更がstashに保存され、ワーキングディレクトリがクリーンな状態になります。

ステップ3:保存したstashを確認する

保存したstashを確認するコマンド:

git stash list

複数のstashがある場合、それぞれに番号が付与されます。

ステップ4:stashの変更を復元する

保存した変更を復元します:

git stash pop

このコマンドで最新のstashが復元され、同時にstashから削除されます。

ステップ5:復元時のコンフリクト対応

復元時に他の変更と競合する場合、Gitが自動的に競合を検出します。この場合は手動でマージする必要があります。

実践的なコード例

例1:基本的なstashの流れ

$ git status\nOn branch main\nChanges not staged for commit:\n  modified:   app.js\n\n$ git stash\nSaved working directory and index state WIP on main: abc1234 Previous commit message\n\n$ git status\nOn branch main\nnothing to commit, working tree clean\n\n$ git stash list\nstash@{0}: WIP on main: abc1234 Previous commit message\n\n$ git stash pop\nOn branch main\nChanges not staged for commit:\n  modified:   app.js

例2:複数のstashを管理する

$ # 1つ目のstash\n$ git stash\nSaved working directory and index state WIP on main: abc1234 Commit 1\n\n$ # ファイルを変更\n$ # 2つ目のstash\n$ git stash\nSaved working directory and index state WIP on main: def5678 Commit 2\n\n$ # stashの一覧を確認\n$ git stash list\nstash@{0}: WIP on main: def5678 Commit 2\nstash@{1}: WIP on main: abc1234 Commit 1\n\n$ # 特定のstashを復元(1番目のstash)\n$ git stash pop stash@{1}

例3:わかりやすいメッセージ付きでstash

$ # メッセージ付きでstashを保存\n$ git stash save \"機能Aの実装途中\"\nSaved working directory and index state On main: 機能Aの実装途中\n\n$ # stashリストでメッセージが表示される\n$ git stash list\nstash@{0}: On main: 機能Aの実装途中

例4:stashの内容を確認する

$ # stashの変更内容を確認\n$ git stash show\n app.js | 5 +++++\n index.js | 3 +--\n 2 files changed, 6 insertions(+), 2 deletions(-)\n\n$ # より詳細な差分を表示\n$ git stash show -p

例5:stashを復元せずに確認してから削除する

$ # stashを適用するが、stashに残す(popではなくapply)\n$ git stash apply stash@{0}\n\n$ # 必要に応じてstashを削除\n$ git stash drop stash@{0}\n\n$ # すべてのstashをクリア\n$ git stash clear

例6:特定のファイルだけをstash

$ # 特定のファイルだけをstash\n$ git stash push app.js\n\n$ # 複数のファイルをstash\n$ git stash push app.js index.js

Git stashでよくある間違い

間違い1:popとapplyの違いを理解していない

間違った使い方:

$ git stash pop\n# stashが復元されて削除される

正しい理解:

  • git stash pop:stashを復元して、stashから削除
  • git stash apply:stashを復元するが、stashには残す

重要な変更を扱う場合は、確認してから削除するためにapplyを使う方が安全です。

間違い2:コンフリクト発生時にパニックになる

間違った対応:

コンフリクトが発生したら、慌ててstashをリセットしてしまう。

正しい対応:

$ # コンフリクトを確認\n$ git status\n\n$ # テキストエディタで競合マーカーを手動で解決\n$ # <<<<<<< HEAD から ======= の間が現在のブランチの内容\n$ # ======= から >>>>>>> stash の間がstashの内容\n\n$ # 修正後、通常通りコミット\n$ git add .\n$ git commit -m \"Merge conflict resolved\"

間違い3:stashしたことを忘れる

問題:

stashしたことを忘れて、同じ変更をもう一度実装してしまう。

解決策:

定期的にgit stash listを確認する習慣をつけましょう。

$ # 毎日の作業開始時に確認\n$ git stash list

間違い4:重要な変更をstashのままにしておく

問題:

stashは一時的な保存手段です。重要な変更は最終的にコミットする必要があります。

正しい流れ:

$ # 作業をstash\n$ git stash\n\n$ # 別の作業を完了\n$ # ...\n\n$ # stashを復元\n$ git stash pop\n\n$ # ファイルを確認\n$ git diff\n\n$ # ステージング\n$ git add .\n\n$ # コミット\n$ git commit -m \"機能Aの実装が完了\"

間違い5:古いstashを管理しない

問題:

時間経過とともにstashが溜まり、どのstashが何なのか不明確になる。

解決策:

$ # 不要なstashを削除\n$ git stash drop stash@{0}\n\n$ # 古いstashをすべて確認\n$ git stash list\n\n$ # 本当に不要なら全削除(慎重に!)\n$ git stash clear

便利なGit stashのTips

Tip1:stashに説明的な名前をつける

$ git stash save \"ユーザー認証機能の実装途中-バグ修正のために一時保存\"\n\n$ git stash list\nstash@{0}: On main: ユーザー認証機能の実装途中-バグ修正のために一時保存

Tip2:特定のファイルだけ復元したい場合

$ # stashから特定のファイルを復元\n$ git checkout stash@{0} -- path/to/file.js

Tip3:stashをブランチに変換する

$ # stashから新しいブランチを作成\n$ git stash branch feature/new-branch\n\n# このコマンドは以下と同等です:\n# git branch feature/new-branch\n# git checkout feature/new-branch\n# git stash pop

Tip4:untracked filesもstashに含める

$ # 追跡されていない新しいファイルも含める\n$ git stash -u\n\n# または\n$ git stash save -u \"説明\""

まとめ

Git stashは、開発を効率的に進めるための非常に便利な機能です。本記事で解説した内容をまとめます:

  • git stashの基本:未コミットの変更を一時的に保存するGitの機能
  • 基本コマンド:git stashで保存、git stash popで復元
  • 管理方法:git stash listで確認、git stash dropで削除
  • 応用:メッセージ付き保存、特定ファイルの保存、ブランチ変換など
  • 注意点:popとapplyの違い、コンフリクト対応、古いstashの管理

最初はgit stashgit stash popだけ覚えれば十分です。慣れてきたら、他のコマンドやTipsを活用して、より効率的な開発フローを構築していきましょう。Git stashを上手く使いこなすことで、複数の機能を並行して開発する際の生産性が大幅に向上します。

開発初期段階では、むしろstashの使用を抑えて、こまめにコミットする習慣をつけることをお勧めします。その上で、緊急対応が必要な場面でstashを活用するというアプローチが、最も安全で学習効果も高いです。

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