1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Git] git stash について:一時的に退避できる

Posted at

In a nutshell

git stash は、作業中の変更を一時的に退避し、作業ディレクトリをクリーンに保つ Git のコマンドである.コミットせずに中断できるため、他の作業やブランチへの切り替えがスムーズに行える.短期間で戻る予定のある作業には特に有効.

はじめに

git stash を使えば,作業中の変更を一時的に保存し,安全に他の作業へ移ることができる.本記事では,初学者向けに git stash の基本的な使い方と注意点,実務での利用例を紹介する.

予想される読み手

  • Git について,初学者である
  • git stash についてあまり分かっていない
  • Git を今後も利用する必要がある

git stash とは

作業中の変更を一時的に退避(保存)して,作業ツリーをクリーンな状態に戻すためのコマンド.例えば, branch を切り替える必要があるが,現在の作業を commit したくないときに用いる.よって,作業中のコードを commit せずに一時的に退避させたいときに便利.例えば,別のタスクが割りこんだり,バグ修正のために他の branch へ移動しなければならない場合,今の作業を中断して退避できる.

実務でのシチュエーション

  • レビュー対応のために別の branch にすぐ切り替えたい
  • ビルドやテストに失敗して,一旦原因を切り分けたい
  • 作業 branch で中断したコードを一時的に退避し,他のタスクに集中したい
  • 複数の作業を並行して行う必要があるとき

使いどころの判断

stash は,短期間だけ作業を中断し,すぐに戻る予定がある場合に適している.逆に,作業が長引きそうであれば,ブランチを分けた方が安全・明確である.

基本的な使い方

作業内容を退避する

git stash

作業中の変更(ステージ済みと未ステージの両方)が退避され,作業ディレクトリが初期状態に戻る.

stash の一覧を表示

git stash list

退避した作業を戻す(最新のもの)

git stash apply

退避した作業を戻して削除

git stash pop

特定の stash を戻す

git stash apply stash@{1}

stash@{0} は一番新しい stash を指す.git stash list で一覧を確認すると対応関係がわかる.

stash を削除する

git stash drop stash@{0}

すべての stash を削除

git stash clear

管理外のファイルも退避する

git stash -u

stash の中身を確認する

git stash show
git stash show -p
  • git stash show:変更ファイル一覧
  • -p をつけると差分(patch)を表示

利点と欠点

利点

  • すぐに作業を切り替えられる
  • 作業の途中で commit 履歴を汚さずに済む
  • 安全に作業を一時退避できる

欠点

  • stash したまま忘れてしまうことがある
  • 複数の stash があると管理が煩雑になる
  • 一部の変更だけを選んで stash するのがやや面倒

代替案

  • WIP(Work In Progress) commit を作成する
    • 一時的にローカルで commit して,後で修正・削除する
  • ** branch を切って作業を避難させる**
    • 一時的な branch を作成して退避することで,より明確に状態を保存できる
  • git worktree を使って別の作業ツリーを作る
    • stash に頼らず複数の作業状態を同時に扱うことができる

備考

stash の内容は Git 内部に保存されるが,永続的ではない

  • stash は永続的な保存手段ではなく,意図せず削除されることもあるため,重要な作業はコミット or ブランチ分岐で保存すべき.

stash はステージ済みの内容も含めて退避する

  • git add した内容も stash に含まれるため,退避後は作業ツリーが完全にクリーンな状態になる.

stash 適用時の競合に注意

  • git stash applypop の際,作業ツリーと衝突があると競合(コンフリクト)が発生する.
  • この場合,通常のマージ同様に手動で解決が必要.

stash に名前(メッセージ)を付けることはできない

  • git stash 自体には名前を直接つけるオプションはなく,自動でコメントが付与される.
  • バージョンによっては git stash save "メッセージ" が使えるが,現在のバージョンでは非推奨.git stash push を使う事が推奨される.

GUI クライアントでは stash の操作がより視覚的にできる

  • Sourcetree や GitKraken など一部 GUI ツールでは,stash の一覧・適用・削除を視覚的に管理可能.
  • CLI が苦手な人にも使いやすい.

他人と共有する用途には向かない

  • stash はローカルな操作であり,リモートへは push できない.
  • 他人と作業状態を共有するには,コミットやブランチのほうが安全.

Summary

  • git stash は作業中の変更を一時保存するコマンド
  • ステージ済み・未ステージの変更をまとめて退避可能
  • applypop の使い分けに注意(pop は削除も行う)
  • 忘れやすく、管理が煩雑になる点に注意が必要
  • 永続保存や共有にはブランチ・WIPコミットが有効
  • GUIツールでも stash 操作は可能で初心者にも扱いやすい

References

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?