MENU

コミットするには早い、そんな時のgit stash

コミットするには早い、そんな時のgit stashを説明する画像

おはようございます、YASUです。

これまでステージング、ブランチ、コンフリクト解消と、Gitの基本操作を一通り触れてきましたが、実は基本中の基本と言えるgit stashをまだ扱っていませんでした。今日はこの作業を一時的に退避する」コマンドについて整理します。

目次

結論

git stashは、コミットするにはまだ早い、作業途中の変更を一時的に「棚上げ」して、作業ツリーをきれいな状態に戻すコマンドです。急に別のブランチに切り替える必要が出た時など、実務で頻繁に使われる場面があります。

どんな場面で困るのか

以前体験した通り、ブランチを切り替えるgit checkoutは、作業中の変更が残っていると失敗したり、意図しない形で影響したりすることがあります。例えばこんな状況を想像してみてください。

1. feature/login ブランチで作業中
2. まだコミットするには早い、中途半端な変更がある
3. そこに「至急、mainブランチの別の箇所を直してほしい」という依頼が入る

この時、中途半端な変更をわざわざコミットするのも変ですし、変更を消してしまうのはもったいない。こんな時に使うのがgit stashです。

基本の使い方

# 今の変更を、一時的に退避する
git stash

# 退避した一覧を確認する
git stash list

# 退避した内容を、元に戻す
git stash pop

git stashを実行すると、コミットしていない変更がすべて、一時的な保管庫(スタッシュ)に移動し、作業ツリーはまるで何も変更していないかのような、きれいな状態に戻ります。

実際の流れで確認する

# 1. 作業中、中途半端な変更がある状態
echo "作業中の内容" >> index.html
git status
# → modified: index.html

# 2. stashで退避する
git stash
# → Saved working directory and index state WIP on feature/login: ...

# 3. status を確認すると、きれいな状態に戻っている
git status
# → nothing to commit, working tree clean

# 4. 安心してブランチを切り替えられる
git checkout main
# (至急の作業をする)

# 5. 元のブランチに戻り、退避していた変更を復元する
git checkout feature/login
git stash pop
# → 退避していた変更が、元通り復元される

popとapplyの違い

調べていて気づいたのですが、退避した内容を戻すコマンドには2種類ありました。

  • git stash pop:退避した内容を戻すと同時に、スタッシュの一覧からも削除する
  • git stash apply:退避した内容を戻すが、スタッシュの一覧には残ったまま

普段はpopで十分ですが、同じ退避内容を複数のブランチに適用したい場合など、あえて一覧に残しておきたい時はapplyを使う、という使い分けがあるようです。

複数の作業を退避している場合

stashは、何度も実行して複数の退避内容を積み重ねることができます。

git stash list
# stash@{0}: WIP on feature/login: ...
# stash@{1}: WIP on feature/design: ...

この場合、特定の退避内容だけを指定して復元することもできます。

git stash pop stash@{1}

コミットとの違い

以前扱ったコミットとの違いを整理すると、こうなります。

  • git commit:変更を、正式な履歴として記録する(意味のある区切りごとに行う)
  • git stash:変更を、履歴には残さず一時的に退避するだけ(あくまで作業の中断・再開のための一時保管)

コミットメッセージのような「何をしたか」の記録を残す必要がなく、気軽に使える点がstashの特徴です。ただし、あくまで一時的な保管庫なので、長期間放置して何を退避したか忘れてしまう、という事故もよく起きるようです。

まとめ

  • git stashは、コミットするには早い作業中の変更を一時的に退避するコマンド
  • git stash popで復元(一覧からも削除)、git stash applyで復元(一覧には残す)
  • 複数の退避内容を積み重ねて管理することもできる
  • コミットと違い、履歴には残らない一時的な保管庫という位置づけ

基本操作のはずなのに、これまで一度も使う場面がなかったので、今回初めて手を動かして体験できました。急な作業の切り替えが必要な実務の場面で、地味に役立ちそうなコマンドです。それでは、また明日!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次