- 公開日
- 最終更新日
【Git】git stashを使った変更差分の退避方法
この記事を共有する

目次
はじめに
現在のプロジェクトでGitをつかったコード管理を行っていますが、
本来変更を行いたいブランチとは別のブランチにて変更作業を行ってしまい、
どのようにして切り戻しを行うか悩んでいました。
そこで使えるのがgit stash
コマンド。
こちらのコマンドをうまく利用することで、
現在のブランチ上で行った変更を退避させることが可能になります。
本記事ではその使い方について説明していきたいと思います。
本記事でわかること
git stash
コマンドについて- Gitでの変更差分の保存、退避方法
※本記事の対象者はGitの基本動作(add,commit等)について把握されている方となります。
git stashコマンドでできること
改めてgit stash
コマンドで行えることを説明すると、
現在のブランチで変更差分を一旦退避させることが可能となります。
使用場面の例
- 間違ったブランチで作業を行ってしまった ★今回私の使用例です...
- 作業中に別作業を実施する必要がある
- コミットするほどではないが、変更分を一時的に保存したい
git stashの対象について
git stash
は、ステージング前・後どちらでも使用可能です。
ただし、以下のようなファイルはオプションを付けないと退避されません。
- 未追跡ファイル(Untracked) →
-u
オプションが必要 - 無視されたファイル(.gitignore) →
-a
オプションが必要
※ 未追跡ファイルとは、これまで一度も
git add
されていない新規作成ファイルのことです。
一覧表
ファイルの状態 | `git stash` で退避できる? | 備考 |
---|---|---|
追跡済み・未ステージング | 〇 | 編集しただけでも退避可能 |
追跡済み・ステージング済み | 〇 | `git add` 済みでも退避可能 |
未追跡ファイル(Untracked) | ×(通常) / 〇(`-u` 使用時) | `git stash -u` または `--include-untracked` を使えば退避可能 |
無視されたファイル(.gitignore) | ×(通常) / 〇(`-a` 使用時) | `git stash -a` または `--all` を使えば退避可能 |
実際にやってみた
実際の操作を行ってみます。
流れとしては、
ファイルを編集→git stash
で変更差分を退避→差分確認で見ていきます。
また、退避させた変更差分を別ブランチで復元します。
※今回は追跡済みファイルを使って作業をします。
ブランチイメージとしては以下構成となります。
(masterブランチからtest01,02のブランチを作成)
master---->test01 git stashをするブランチ
¦
¦-->test02 復元するブランチ
以下手順で既にステージング・コミットしている状態のファイルに変更を加えていきます。
①変更前のファイル確認
# cat gittest01
this is file
追跡済みファイル
②ファイルに変更を加える
⇒"変更点****"を新規追加
# vi gittest01
# cat gittest01
this is file
追跡済みファイル
変更点********************************
********************************************
③退避後、ファイル確認
オプション"-m"をつけることでメッセージをつけることができます。
# git stash -m "test01 stash"
Saved working directory and index state On test01: test01 stash
# cat gittest01
this is file
追跡済みファイル
上記結果よりgit stash
後、ファイルの変更が最初の状態に戻っていることが確認できます。
次の作業から、実際に他ブランチ(test02)にて、退避させたものを復元させていきます。
④退避させたものを確認
2つのコマンドで確認を行っていきます。
1つ目はgit stash show
こちらは、退避させたものとの差分内容を表示することができます。
2つ目はgit stash list
こちらは退避させているもの自体を確認することができ、
先ほど"-m"オプションで付けたメッセージ内容がこちらで表示されます。
# git stash show
gittest01 | 4 ++++
1 file changed, 4 insertions(+)
# git stash list
stash@{0}: On test01: test01 stash
⑤退避させたものからの復元
それでは最後に退避させたものを復元させていきます。
今回は"test02"ブランチにて実行していきます。
復元のコマンドはgit stash pop
にて可能です。
※デフォルトだと最新の退避させたものから復元がされます。
複数、退避させたものがある場合、listで確認した番号(stash@{0}の部分)を指定することで、
特定のstashが可能となっています。
##変更前確認
# git checkout test02
# cat gittest01
this is file
追跡済み
##復元作業
# git stash pop
On branch test02
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: gittest01
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (03d8a5e4adce6b0b08cb2267b066c20108b53e25)
##復元後確認
# cat gittest01
this is file
追跡済みファイル
変更点********************************
********************************************
変更差分が更新され復元されていることがわかります。
※復元されると退避させていたものは削除されます。
さいごに
上記いかがだったでしょうか。
自分自身、Gitに触れはじめたのが最近でまだまだ勉強中なところがありますが、
Git操作内での便利なコマンドの一つなのかなと感じました。
理解を一層深め、Gitと友達になれるよう頑張っていきます。
この記事は私が書きました
佐藤 祐弥
記事一覧日々の業務上での学びをコツコツアウトプットできればなと思います。
