まず、はじめにgitは、1つの作業テーマに1つのブランチを作成して作業します。
だいたい機能追加とかバグ修正とかの単位でブランチを作って作業します。(ちゃんとやってますよね?)
そんな中で、こんな時ありませんか?
- ブランチを間違えて作業してしまっていた!!!やべ!!
- あるブランチで作業中だけど、いますぐ他のブランチでやりたいことができた。ブランチを切り替えるためにコミットしないといけないけど、作業すごく中途半端だからコミットはしたくない、、、
- 作業の途中で別の修正を優先してお願いされる、、、、そんな時は、別のブランチに切り替えないといけない。何も考えずブランチを切り替えるとエラー。。。
上記の場合、ブランチを切り替えたい、、、
でもコミットしていない変更点があってブランチを切り替えられず、「変更をコミットしてください」と怒られる
その時の解決策としては大きく2つあります。
- 1つ目は、コミットしてしまうことです。
ある程度編集が落ち着いているのであれば、アドしてコミットしてしまっていいと思います。 - 2つ目がgit stashを使うことです。
こちらが今回の本題です。
では、git stashについて説明します。
#git stashとは一時的に変更を保存すること
まず、git stashとは変更を一時的に保存しておくことです。
git stashをするとローカルの作業ファイルが綺麗な(変更点のない)状態になります
そうすると、自由にブランチを切り替えることができます。
#git stashの流れ
git stashの大まかな流れを説明します
##変更を一時退避させる
下記のコマンドでコミットをまだしていない変更点を一時退避します
コミットしていない変更点なので、addしているかどうかは関係ありません
git stash -u
###オプション-uについて
上記のコマンドについている-uは--include-untrackedの略です
Gitがまだ追跡を開始いていない新規作成のファイルも一時退避させるためのオプションです
このオプションをつけないと新規作成したファイルなどは一時退避されません
##コミットメッセージをつける
作業ファイルを確認してみましょう
変更した箇所が最新のコミット状態に戻っていると思います。
では、変更はどのように保存されているかを確認しましょう
下記のようなコマンドでコミットメッセージを残すことも可能です
コミットメッセージmessage
を残しています
git stash push ”message”
git stash save
は非推奨となったようです
##一時退避を確認
確認は以下のコマンドでできます。
実行結果が一時退避させた変更点になります
git stash list
// 実行結果
stash@{0}: WIP on hoge_branch: 7ea2020 Update hoge.rb
実行結果について説明します。
スタッシュ名stash@{0}
はブランチ名hoge_branch
の作業でコミットハッシュ7ea2020
のコミットメッセージ Update hoge.rb
の変更です
以上が実行結果の内容です
###スタッシュした内容の詳細を確認する
下記のコマンドで一時退避した内容の詳細を見ることができます
git stash show -p ハッシュ名
##別ブランチで作業スタート
一時退避ができていれば、git status
などで作業ファイルが綺麗な状態か確認し、
ブランチを切り替えて作業をしましょう。
##一時退避を戻す
作業が完了したら元の状態に戻したいと思うので、戻していきましょう
下記のコマンドで一時退避を現在いるブランチに反映させることができます
下記のコマンドはスタッシュ名stash@{0}
を反映させる時のコマンドです
スタッシュ名を指定しない時は直前のスタッシュが反映されます
git stash apply stash@{0}
##使い終わった一時退避を削除する
使い終わったスタッシュは削除しましょう
ためていくと履歴がカオスなことになるので、こまめに消すことをオススメします!!
git stash drop stash@{0}
以上がgit stashを使って行う作業の大きな流れです。
ここからは、もっと便利なgit stashの機能について説明します。
#その他の便利機能
##一時退避した内容を反映と削除を一緒にする
apply
とdrop
をいっぺんにやってくれるコマンドです
git stash pop stash@{0}
##インデックスの内容もそのまま一緒に一時退避する
下記のコマンドでインデックスの内容(addしたファイル)をそのままに一時退避することもできます
git stash -k
オプション:-k
もしくは --keep-index
##スタッシュを全て消す
下記のコマンドで一時退避したスタッシュを全部消すことができます
全て消えてしまうので注意してください
$git stash clear
以上です!!!
ここまで読んでいただきありがとうございました!!
疑問、気になるところがございましたら、質問、コメントよろしくお願いします!!!