git

git stash: 作業途中内容を退避する

How to use git command 2/N

公開日: 2020-12-31
更新日: 2024-07-11

  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



Share Buttons
Share on:

Feature Tags
Leave a Comment
(注意:GitHub Accountが必要となります)