110
78

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

git stash についてまとめてみた(file単位でstashしたい)

Last updated at Posted at 2017-09-14

この記事を書いたきっかけ

git stash をファイル単位で行いたい...

そんなわけで、ついでにGitマニュアルのStashページのまとめとかしてみました。
あまり使わないオプションもあるので、間違っていたらどなたか教えていただけると助かります。

そもそも、stashって?

変更点を一時的に退避させるコマンドだと認識しています。
(マニュアルは汚れたディレクトリを隠すと記載しています)

基本的な使い方

だいたい、変更した内容を一時的に退避させるのに使います

// ステータス確認
C:\work\hoge>git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   nanikano_app/app/controllers/hogehoge_controller.rb

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        nanikano_app/app/controllers/fugafuga_controller.rb
        
// stash 実施
C:\work\hoge>git stash
Saved working directory and index state WIP on master: d6816cb hogehoge
HEAD is now at d6816cb hogehoge

// 再度ステータス確認(退避済)
C:\work\hoge>git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        nanikano_app/app/controllers/fugafuga_controller.rb

// stashされているものを復元
C:\work\hogegit stash pop
Removing nanikano_app/app/controllers/hogehoge_controller.rb
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   nanikano_app/app/controllers/hogehoge_controller.rb

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        nanikano_app/app/controllers/fugafuga_controller.rb

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (d4a0db5f1676baf0e208bhogea30832589e4hoge)


// ステータス確認
C:\work\hoge>git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   nanikano_app/app/controllers/hogehoge_controller.rb

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        nanikano_app/app/controllers/fugafuga_controller.rb

と上記のように、Untracked fileは退避できない(オプション次第ではできる)
基本的にはstashで退避させてpopで退避させたものを復元するイメージ

Git manualのシノプス

git stash list [<options>]
git stash show [<stash>]
git stash drop [-q|--quiet] [<stash>]
git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]
git stash branch <branchname> [<stash>]
git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
	     [-u|--include-untracked] [-a|--all] [<message>]
git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
	     [-u|--include-untracked] [-a|--all] [-m|--message <message>]]
	     [--] [<pathspec>…​]]
git stash clear
git stash create [<message>]
git stash store [-m|--message <message>] [-q|--quiet] <commit>

git stash list

今、stashしている物のリストを表示します。

stash@{0}: WIP on submit: 6ebd0e2... Merge branch 'dev'
stash@{1}: WIP on master: 9cc0589... Add work files

stash@{X}のXに当たる数字が低いほど新しいstashで、
onほにゃららの「ほにゃらら」に当たる部分が対象のブランチ
その後の7桁の文字列がコミットID
最後に記載されているのが、コミットメッセージになります。

git stash show

stashした内容の詳細を表示してくれる

C:\work\hoge>git stash show
 .../app/controllers/hogehoge_controller.rb       |  14 --------------
 .../app/controllers/watashino_controller.rb      |   1 +
 2 files changed, 1 insertions(+), 14 deletions(-)

なお、バージョンを指定することでstashを選択することも可能(指定しない場合は最新の物の差分を表示)

C:\work\hoge>git stash show stash@{0}
 .../app/controllers/hogehoge_controller.rb       |  14 --------------
 .../app/controllers/watashino_controller.rb      |   1 +
 2 files changed, 1 insertions(+), 14 deletions(-)

-p

-pをつけるとgit diffのように詳細を表示してくれます。

git stash show -p stash@{0}
git stash show -p

git stash drop

stashで退避させたものを削除します。
末尾にバージョンを記載することで対象を選ぶことも可(記載しない場合は最新のstashを削除する)

git stash drop
git stash drop stash@{0}

git stash branch

stashしている物をpopする際に新しくbranchを作成してそこにpopしてくれる
ただしbranchは対象のstashがされたコミットから作成されます。

git stash branch hoge  // 現在Stashしている物をhogeというbranchを新規作成したのちにpopする
M   memo/memo20170914.txt
Switched to a new branch 'hoge'
On branch hoge
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   memo/memo20170914.txt

これもstashのバージョンを指定することが可能
だいたいgit stash popで競合が発生したときに使用するイメージ

git stash (save)

変更点を退避させる
saveをつけても同じ動きになる
末尾に"(ダブルクォート)で囲んだ文字列を記載するとメッセージを入れたstashを記載できる。

git stash
git stash save
git stash "this is add files"
git stash save "this is add files"

-p|--patch

ファイルの中の変更点のうちどれをstashするかを指定することができる。

git stash -p
git stash --patch

-k|--[no-]keep-index

addしていないファイルのみをstashします。

git stash -k
git stash --keep-index
git stash --no-keep-index

-q|--quiet

stashのログを表示しない

C:\work\hoge>git stash list
stash@{0}: WIP on hoge: 8sje7lk test

C:\work\hoge>git stash -q

C:\work\hoge>git stash list
stash@{0}: WIP on hoge: she9ujh dev
stash@{1}: WIP on hoge: 8sje7lk test

-u|--include-untracked

untrackedなfileも一緒に退避します。

git stash -u
git stash --include-untracked

-a|--all

git管理外のファイルも一緒に退避します

git stash -a
git stash --all

で、ファイル単位でstashしたいんだけど...

マニュアル見た感じでは方法(option)がなかったので、stashしたいファイル以外をaddしたのちにgit stash -k でstash した後にgit reset 使って元に戻しています。

実施イメージ
C:\work\hoge>git status
On branch piyo
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   ../memo/hoge.txt
        modified:   ../memo/fuga.txt

no changes added to commit (use "git add" and/or "git commit -a")

C:\work\hoge>git add ../memo/hoge.txt

C:\work\hoge>git status
On branch piyo
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   ../memo/hoge.txt

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   ../memo/fuga.txt


C:\work\hoge>git stash -k
Saved working directory and index state WIP on piyo: 19daa6e hoge
HEAD is now at 19daa6e hoge

C:\work\hoge>git status
On branch piyo
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   ../memo/hoge.txt


C:\work\hoge>git reset
Unstaged changes after reset:
M       memo/hoge.txt

C:\work\hoge>git status
On branch piyo
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   ../memo/hoge.txt

no changes added to commit (use "git add" and/or "git commit -a")

110
78
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
110
78

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?