Table of Contents
git stash
とは?
git stash
は現在焼いている途中の肉を皿に退避させて,網を交換(=交換という別作業)をする際に使うコマンドです.
より正確には「現在焼いている途中の肉を皿に退避させて」というアクションを実行するのがgit stash
に相当します.
▶ git stashの活用場面
- gitでtrackされているファイルについて現在作業している
- このとき, trackされているファイルについてcommitすることなくbranchを変えることはできない
- working directory, staging areaどちらについても当てはまる
- 突然, HOTFIX対応の命令が上司からやってきて, 作業branchを変える必要が出てきた
- 現在の作業内容は躊躇半端なためcommitはしたくない
- かといって, 現在の作業内容を破棄したくはない
このようなシチュエーションのときに,git stash
することで,working areaの現在の内容をcommitすることなく保存してbranch切り替えができるようになります. git stash
= 一時保存,のコマンドと理解できます.
Stashing is handy if you need to quickly switch context and work on something else but you’re mid-way through a code change and aren’t quite ready to commit
コマンド | 説明 |
---|---|
git stash |
作業を退避させたい場合 |
git stash -u |
untracked fileについても作業を退避させたい場合 |
git stash --include-untracked |
untracked fileについても作業を退避させたい場合 |
git stash save <message> |
コメント付きで作業を退避させたい場合 |
git stash list |
退避した作業一覧の取得 |
git stash list -p |
退避した作業一覧を差分箇所とともに表示 |
git stash show |
直近のstashと現在の状態のdiffの確認 |
git stash branch <branch name> <stash_id> |
指定したstashに基づいたbranchの作成 |
git stash pop |
最新のstashをrestore & stash listからrestoreしたstashを削除する |
git stash apply |
最新のstashをrestore & stash listからrestoreしたstashを削除しない |
git stash drop |
最新のstashを削除 |
git stash drop stash@{index} |
退避した作業の1つを削除 |
git stash clear |
退避した作業すべての削除 |
How to use git stash
git stash untacked file
untracked fileはデフォルトではなgit stash
することができません.
untacked fileも含めてgit stash
する場合はoptionを付与して以下のいずれかを実行します
1
2
3
4
5
## short option
% git stash -u
## long option
% git stash --include-untracked
How to use git stash drop
引数なしでの実行
1
% git stash drop
と引数なしで実行すると, 直近のstashが削除されます.
複数stashのdrop: 連続index版
以下の状況を例とします
1
2
3
4
5
6
% git stash list
stash@{0}: WIP on main: 1234567 first commit
stash@{1}: WIP on main: 1234568 update css
stash@{2}: WIP on main: 1234569 update css.min
stash@{3}: WIP on main: 1234569 update css.min
stash@{4}: WIP on main: 1234571 update README.md
このとき,1~3
の連続indexのstashをdropしたい場合は,
1
2
3
4
5
6
START_INDEX=1
END_INDEX=3
for i in $(seq $END_INDEX -1 $START_INDEX); do
git stash drop stash@{$i}
done
とします.git stash drop
をするたびにindexが変化してしまうため,複数indexを対象に
stash dropする場合は最新のindex(=index番号が大きい)からdropすることが良いと思います.
git stash
のユースケース
誤って別ブランチにコミットしてしまった場合
▶ 問題設定
1
2
% % git branch
* main
という状況で,touch test_kerneldensity.py
というファイルを作成してstaged & commitしたとします.
commitしたあとで test_kerneldensity.py
ファイルは main
ブランチではなくて unit_test
ブランチを新規に作成し,そのブランチに対してcommitしたかったことに気づいたケースを想定します.
つまり,
- 新規に作成したファイルを誤ったブランチにcommitしてしまったので,そのブランチをクリーンにしたい
- 新規に作成したファイルを新しいブランチにcommitしたい
の2つのアクションが必要となります.
▶ Solution
1
2
3
4
5
6
7
8
9
10
11
# main branchをclean + 新規作成ファイルを退避
% git reset HEAD~ --soft
% git stash
# 正しいブランチへ移動
% git switch -c unit_test
% git stash pop
% git add . # or add individual files
% git commit -m "TEST: add kerneldensity test file";
# 修正完了
References
(注意:GitHub Accountが必要となります)