いつ使うのか?
コミットはせずに変更を退避したいときに使用します。例えば、
「ブランチAで作業していたけど、急にブランチBで作業する必要が出てきたので、切り替えなければいけない。
しかし、作業が途中なのでコミットはしたくない。」
なんて時にgit stash
を使用します。
流れとしては、
ブランチAの作業は一旦置いておきたいのでgit stash
で変更を退避させる。
ブランチBへ移動。
ブランチBで今すぐやりたい作業を終わらせる。
ブランチAに戻ってきて、git stash
で退避させていた変更を戻して作業を再開。
こんな感じになります。
このような一連の流れで使用するstash
のコマンドを紹介します。
変更を退避する
$ git stash
or
$ git stash save
メッセージ付きでスタッシュ
$ git stash save "something message"
スタッシュしたリスト一覧を表示
$ git stash list
こんな感じで出力されます。
$ stash@{0}: WIP on test: xxxx
退避した作業を元に戻す
$ git stash apply stash@{0}
退避した作業を消す
$ git stash drop
退避した作業を元に戻して、退避した作業を消す
つまり, apply
+ drop
になります。
最新のものが適応される。
$ git stash pop
指定も可能
$ git stash pop stash@{0}
http://hpcmemo.hatenablog.com/entry/2018/05/11/114403
git stash popでconflictが発生したら!!!!
サーバ側のファイルに合わせる場合
$ git checkout --theirs <path>
# 例
$ git checkout --theirs .
$ git checkout --theirs fileA.txt
自分の方のファイルに合わせる場合
$ git checkout --ours <path>
# 例
$ git checkout --ours .
$ git checkout --ours fileB.txt
個別に設定する場合
例えば、fileA.txt
,fileB.txt
,fileC.txt
の3ファイルがリポジトリにあったとすると fileA.txt
とfileB.txt
は手元にあるファイルの状態にし、fileC.txt
だけstashしてた状態のものをとり込むという操作行う場合には、個別にファイルをcheckoutして上書きします。
git checkout --theirs stash@{0} fileC.txt
git stash pop
でコンフリクトしたらstash
は消えないので、git stash drop
で削除しておきましょう。
退避した変更の詳細をみる
$ git stash show stash@{0}
-pで変更内容の詳細をみることもできます。
$ git stash show stash@{0} -p
退避した作業をすべて消す
$ git stash clear
新規追加したファイルも退避
新規に追加したファイルをaddしていない状態で退避させるには-u
もしくは--include-untracked
を使用。
$ git stash -u
addした変更以外を退避させる
git stash
は新規追加ファイル以外の変更が退避されます。
-k
もしくは--keep-index
をつけて実行すると、add
した変更は退避されません。
$ git stash -k
まとめ
git stashは結構使うので、aliasでショートカットを作成しておくと便利です。
aliasの設定は以下になります。