今回はgit commit
せずに別branchで作業したい…そんな時に使用できるgit stash
とgit worktree
についての記事です。
以前、自身がお世話になっている もりけん塾の勉強会で git worktree
を教えていただきましたが、
当時は use caseにいまいちピンときていなく、実際業務で必要になった場面で使用することができませんでした… git worktree
は以前書いた記事があるので、今回はgit stash
を使用したパターンをまとめました。
git commitせずにbranchを切り替えるとどうなる?
内容がmergeされてしまう。つまりfeatureブランチで新機能を開発していた際に、git commit
せずに他branchへcheckoutしてしまうと、featureブランチで作業していた内容がcheckout先のブランチにmergeされる。
mergeした際にコンフリクトが発生する場合は、エラーがでるので自動的にmergeはされない。
% git checkout **
error: Your local changes to the following files would be overwritten by checkout:
index.html
Please commit your changes or stash them before you switch branches.
Aborting
具体的な use case
現在、featureブランチで機能追加を実装中。
「「 バグ発生 !!!!!!!!!!!!!!!!!!!!!!至急対応!!!!!!!!!!!!!!!!!!! 」」
機能追加を実装していたfeatureブランチではなく、
新たにブランチを切ってバグ対応をしなくてはいけない状況に。
しかし、機能追加実装中のfeatureブランチ内はまだcommitしたくない…そんな時!!!!!!
git stash
stashは隠すという意味
作業中の内容をstashする
% git stash
Saved working directory and index state WIP on feature: d1cb3ed Merge pull request #10 from sae-github/dev
git stashでは untrackファイルはstashされないので注意。
% git stash
No local changes to save
untrackファイルも含めて退避させたい時は -u (--include-untracked)
オプションを付与する
% git stash -u
git statusで現在の状態を確認
作業途中の内容はstashされ、working tree cleanに
% git status
On branch feature
nothing to commit, working tree clean
stashした一覧を確認
% git stash list
stash@{0}: WIP on feature: d1cb3ed Merge pull request #10 from sae-github/dev
// WIP on の後はbranch名
退避した作業内容を反映する
% git stash apply
On branch feature
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: index.html
no changes added to commit (use "git add" and/or "git commit -a")
不要なstashを削除する
% git stash drop
Dropped refs/stash@{0} (92fad7c538481485cec40c24404dd7274fbb9710)
その他、良さそうなコマンド
messageをつけてstashしたい時
% git stash save "message"
Saved working directory and index state On feature: message
% git stash list
stash@{0}: On feature: message
退避した作業をもとに戻し、リストからも削除する
(applyとdropを同時にやってくれる)
% git stash pop stash@{0}
git add していないものだけstashさせたい
untrackファイルはstashされないので注意。
% git stash -k