ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

【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と友達になれるよう頑張っていきます。

この記事は私が書きました

佐藤 祐弥

記事一覧

日々の業務上での学びをコツコツアウトプットできればなと思います。

佐藤 祐弥

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。