git stashのメモ
はじめに
データ事業本部のおざわです。普段コマンドラインでgitを使うのですが、git stashでいつもの使い方以外のことをやろうとすると、毎回ググっているので自分用にブログとして書き残しておきたいと思います。
git stashとは
git stashはワーキングツリーの内容を一時的に退避しておくコマンドです。個人的な使い所としては、作業を始めたあと間違ったブランチで作業をしていたことに気づいた時です。他には、作業中にリモートブランチに変更が入った場合に、その変更を取り込んでから現在の作業内容を戻す時などです。
個人的によく使う内容
やってることは同じです。stashで作業中の内容を退避したあと、ブランチを切り替えるなりプルしてから、stashした内容を下に戻しています。
git stash
のあとに何も引数を指定しない場合はgit stash push
を実施したときと同じ動きをします。
1. 作業するブランチを間違えていた
# developで作業中…
git stash # 変更内容をstash(退避)
git switch my_correct_branch # ブランチを移動
git stash pop # 変更内容をstashから戻してstashを削除
ちなみに1つ前に作業していたブランチに戻る方法としてgit switch -
が使えます。私は最近まで知りませんでしたが、とても便利です。
git switch -
2. 作業中の内容を退避してからリモートブランチの変更を取り込みたい
git stash # 変更内容をstash
git pull # リモートブランチの変更を取り込む
git stash pop # 変更内容をstashから戻してstashを削除
他にも便利そうなコマンド
git-stashのドキュメントをながめていて、個人的に使えそうだと思ったコマンドをメモしておきます。
- list - stashの一覧を表示します
- show - 特定のstashの内容を表示します
- drop - 特定のstashを削除します。
- pop - pushの反対でstashの一覧の最新のstashを現在のワーキングツリーに適用して、stashから削除します
- apply - 指定されたstashを現在のワーキングブランチに適用します。stashからは削除しません
list
stashのエントリーを一覧で表示します。popで適用&削除されるのは一番最新のstashエントリーです。
> git stash list
stash@{0}: WIP on main: c378d98 added another file
stash@{1}: WIP on main: b011528 first commit
show
特定のstashの内容を表示します。stashを指定しない場合は一番最新のstashとの比較になります。
オプションなしで実行するとstashとの差分を要約した形で表示します。以下のようにdiff-optionを指定するとgit diffと同じ形で内容まで表示できます。
> git stash show -p stash@{0}
diff --git a/ANOTHER_FILE.md b/ANOTHER_FILE.md
index d014168..63f787d 100644
--- a/ANOTHER_FILE.md
+++ b/ANOTHER_FILE.md
@@ -1 +1,2 @@
this is test
+this is second change
drop
特定のstashを削除します。
> git stash drop stash@{1}
Dropped stash@{1} (123c380ec855f8af246510376aa302c4c518882d)
pop
stashを一覧から削除して、内容をワーキングツリーに反映します。pushの反対ですね。stashを指定せずに実行した場合は最新のstashがpopされます。
> git stash pop
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: ANOTHER_FILE.md
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (1237a9fafc33c8660e8e201ac6da0a01ddd0f449)
stashの内容と現在作業中の内容がコンフリクトする場合はエラーが出ます。
error: Your local changes to the following files would be overwritten by merge:
ANOTHER_FILE.md
Please commit your changes or stash them before you merge.
Aborting
apply
popと同じでstashの変更を適用します。popと違うのは適用したstashを残しておくところです。stashを指定しない場合は最新のものが反映されます。
> git stash apply
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: ANOTHER_FILE.md
> git stash list # 削除されない
stash@{0}: WIP on main: c378d98 added another file
stash@{1}: WIP on main: b011528 first commit
おわりに
以上、git stashの操作方法を簡単にまとめてみました。