皆さん、gitを何で操作していますか?
ソースツリーでしょうか、テキストエディタ上のソース管理ツールでしょうか。
あるいはコマンドでしょうか。
私はエンジニア1年目の時は、操作できればOKと思っていたのでずっとソーツツリーを使っていました。
ただ次第に、経験豊富な周りの先輩方は、gitは全てコマンドで操作していることに気付いたのです。
なぜみんな、ソースツリーを使わないんだろうと思って聞いてみると、
・gitを使うときに専門用語は避けて取れない道のりだから。
・テストや本番用のサーバ内で操作する際、gitコマンドで操作するようになるから。
とのことでした。
そこで少しずつ、私もgitをコマンドで操作するようになったわけですが、特に「これは便利だ!」と思ったコマンド、「git stash」について、書きたいと思います。
git stashって何が便利なの?
あるブランチでの作業途中に、こういった経験はありませんか。
・他のブランチの変更を一旦取り込む必要があるんだけど…
そんなとき、コミットしていないと下記のようなエラーが出ますよね。
error: Your local changes to the following files would be overwritten by checkout:
..(中略)..
Please commit your changes or stash them before you switch branches.
これは簡単に言うと、
「ブランチ切り替えると作業中の内容が上書きされてしまうよ!ブランチ切り換え前に、変更をコミットするか、stashしてね!」と言う意味です。
作業のキリが良い場合は、一旦コミットすれば解決ですが、
・まだ中途半端なのでコミットしたくない…
と言う場合は、git stashを使うと、下記の流れでコミットせずに一時退避で作業を継続することができます。
① 作業内容を一旦退避させる
② 現在のブランチが変更のない綺麗な状態になる
③ ブランチを切り替えたりpullしてきたりできる
④ 再度退避させた作業内容を反映させる
git stashの基本的な使い方
作業を退避する
使い方は簡単です。コミット前の退避させたい変更内容がある状態で、下記どちらかのコマンドを叩くだけ。
(他の退避内容と区別したい場合はメッセージをつけることができます)
-- ただ退避させたい時(saveは省略可)
git stash save -u
-- 名前をつけて退避させたい時
git stash save -u "タスクを一時退避"
ちなみに -u をつけると、未追跡の変更も含めて退避させてくれます。
退避した未追跡の変更は、戻すと再び追跡されていない変更となります。
新規ファイルを作成し作業することもあると思うので、基本的には -u を含めて実行した方がスッキリ退避できそうです。
退避した作業一覧を確認する
下記を実行すると今まで実行した退避作業一覧を確認できます。
$ git stash list
stash@{0}: On master: タスクを一時退避
stash@{1}: WIP on master: (~省略~)
上から順に最新の退避履歴です。新たに退避すると一番上に追加されます。
退避した作業内容を戻す
作業内容を戻す場合は、どの退避内容かを指定することもできます。
指定する際は git stash list で一覧表示した際の stash@{数字} を使用します。
-- 最新の退避内容を戻す
git stash apply
-- 退避内容を指定して戻す
git stash apply stash@{0}
ちなみに git stash apply 実行時は、退避一覧から戻したものは削除されませんが、下記コマンドを叩けば、作業を戻すと同時に退避一覧から削除することができます。
-- 最新の退避内容を戻す & 同時に退避一覧から削除
git stash pop
-- 退避内容を指定して戻す & 同時に退避一覧から削除
git stash pop stash@{0}
退避一覧から削除する
退避一覧から削除する場合も、戻す場合と同様にどの退避内容かを指定することもできます。
指定する際は git stash list で一覧表示した際の stash@{数字} を使用します。
-- 最新の退避内容のみを削除
git stash drop
-- 退避内容を指定して削除
git stash drop stash@{0}
-- 退避一覧を全て削除
git stash clear
一歩踏み込んだ使い方
退避内容の詳細を確認したい
git stash list で退避一覧までは確認できますが、退避の内容まで確認はできません。
どんな内容かを確認したいときは、下記コマンドでファイル詳細を確認できます。
-- 最新の退避内容のみのファイル詳細を確認
$ git stash show
-- 退避内容を指定してファイル詳細を確認
$ git stash show stash@{0}
.../test.ts | 9 ++
.../test1.tsx | 11 +-
.../test2.tsx | 133 ++++++++++++++++++---
3 files changed, 134 insertions(+), 19 deletions(-)
また、どのファイルが、ではなく、どのファイルのどんな変更が、を知りたいときは -p オプションをつけると git diff のような変更差分を確認できます。
-- 退避内容の変更詳細を確認
git stash show -p stash@{0}
おわりに
いかがでしたでしょうか。
git操作は基本的なものしか使ったことがありませんでしたが、以前の勤務先で困っていた際に同僚に教えてもらいました。
せっかく便利コマンドがあるので、適当にコミットしておくか、よりも退避させておいた方がコミットログも綺麗になって嬉しいですよね。
少しでも学びの力になれれば嬉しいです。
ではまた!