旅するえんじにあ - Engineers to Travel -

旅するエンジニアの気まま備忘録

【git】 コミットをせずにインデックスにあるファイルを一時退避させる git stash

今の仕事ではルール上いろんなブランチを行き来しながら作業することが多いです。 そんな時よく発生するのが、作業中に急に別ブランチで作業しないといけないみたいな。

しかも作業中で今commitしたくない・・・

そんな時にはgit stashを使います。

まずは新規ファイルを作ってみる

$ touch foo.txt
$ git status
# On branch test_stash
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#       foo.txt
nothing added to commit but untracked files present (use "git add" to track)

ファイルをaddしてインデックスに追加する

$ git add .
$ git status
# On branch test_stash
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#       new file:   foo.txt
#

ここでついに登場stash まずはヘルプを見てみましょう

Usage: git stash list []
   or: git stash show []
   or: git stash drop [-q|--quiet] []
   or: git stash ( pop | apply ) [--index] [-q|--quiet] []
   or: git stash branch  []
   or: git stash [save [--patch] [-k|--[no-]keep-index] [-q|--quiet] []]
   or: git stash clear

色々あるのですが、よく使う部分でいうと

一時退避、退避したstashを戻す、git stash listで退避したstashを消す。 主にこの辺です。

まずは退避から status見るとインデックスに先ほどのnew fileがあります。

そこでgit stashをすると一時的に退避させることができます。 git stash saveでも良いのですが、省略可能なのでgit stashってしちゃいました。 stashをした後、git statusで確認してみるとnothing to commitになって無事退避できました。

$ git status
# On branch test_stash
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#       new file:   foo.txt
#
$ git stash
Saved working directory and index state WIP on test_stash: 9afc620  commit_comment
HEAD is now at 9afc620  commit_comment

$ git status
# On branch test_stash
nothing to commit (working directory clean)

次に退避したstashを呼び戻しましょう。 stashした内容はgit stash listで確認ができます。

$ git stash list
stash@{0}: WIP on test_stash: 9afc620 commit_comment

一個出てきました。

先ほどstashしたものです。

次は復活です。

復活の方法にはいくつかあります。

|git stash apply stash@{n}|復活!| |git stash pop stash@{n}|復活と同時に復活したstashを削除|

それではapplyしてみましょう。

$ git stash apply stash@{0}
# On branch test_stash
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#       new file:   foo.txt
#

おかえりfoo.txt

この場合、git stash list で確認をすると先ほどgit stashしたものが残っています。

一緒に消したい場合はpopを使います。

$ git stash pop stash@{0}
# On branch test_stash
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#       new file:   foo.txt
#
Dropped stash@{0} (30903f9efca6c0506e1c1ee452cba459664e7aec)
$ git stash list
$ 

お帰りfoo.txtそしてグッバイstash

こんな感じです。

個別にstash を消したい場合は

$ git stash list
stash@{0}: WIP on test_stash: 9afc620 commit_comment
$ git stash drop stash@{0}
Dropped stash@{0} (a7e9d38c119334f11b0ec27b270e452cc3a2c932)

最後にgit stash が貯まってしまって、すべて削除したい場合

$ git stash clear

これをすることによってすべてのstashを削除することができます。

git stashを使ってより良いgit Lifeを!