Git Stashを極める:コンテキストスイッチの高速化と「未完了」を操るプロの流儀
開発の現場において、最も生産性を殺すのは「強制的な中断」だ。
レビュー依頼の割り込み、緊急バグフィックス、あるいは「あ、これ別のブランチでやるべきだった」という初歩的なミス。
多くのエンジニアが `git stash` を単なる「一時的なゴミ箱」として使っているが、それはFerrariで近所のコンビニに行くようなものだ。本稿では、Gitの隠れたポテンシャルを解放し、コンテキストスイッチのコストをゼロに近づける「プロのスタッシュ術」を伝授する。
—
1. 「スタッシュの断片化」を防ぐ:名前付きスタッシュと管理術
`git stash` を連打すると `stash@{0}, stash@{1}…` と無機質なリストが出来上がり、数時間後には「どれが何の作業だったか」を思い出すために全てのスタッシュを `git stash show` する羽目になる。これは時間の無駄だ。
推奨プラクティス:名前付きスタッシュ
常にメッセージを付与して保存する癖をつけろ。
修正の目的を明記する。これだけで記憶のコストが消える
git stash save “feat: ログイン画面のバリデーション修正途中”
必殺技:スタッシュの「特定」と「取り出し」
リストが長くなっても、以下のコマンドで一発で探し出せる。
メッセージ検索(grep)
git stash list | grep “ログイン”
特定のスタッシュを適用し、即座にスタッシュスタックから削除(pop)
git stash pop stash@{n}
—
2. 変更の一部だけを切り出す:`git stash -p` の魔力
「AとBを修正したけど、Aだけを先に別のブランチに持っていきたい」という場面、ブランチを切り替えて `git checkout -p` などと格闘していないか?
`git stash -p`(patchモード)を使えば、変更のチャンク(塊)ごとに取捨選択してスタッシュできる。
変更の一部だけをスタッシュする
git stash save -p “APIエンドポイントの変更のみ切り出し”
このコマンドを実行すると、Gitが対話的に「この変更を含めるか?」と聞いてくる。必要な部分だけをスタッシュし、残りは作業ディレクトリに残す。コミット粒度を綺麗に保つための最強の武器だ。
—
3. 生産性を劇的に変える `.gitconfig` のハック
エンジニアの腕は、設定ファイルに現れる。以下のエイリアスを `.gitconfig` に追加し、キーボードから手を動かす回数を減らせ。
[alias]
# スタッシュを一覧で見やすく表示
sl = stash list –pretty=format:”%C(yellow)%gd%C(reset): %s”
# 最近のスタッシュを詳細まで見る(-p付き)
sd = stash show -p stash@{0}
# 追跡対象外のファイルも含めてスタッシュ(全削除に近い退避)
sa = stash save -u “auto-stash: $(date +%Y%m%d-%H%M%S)”
絶対に入れるべきツール:`fzf`
CLIの操作を神速にするために、`fzf` と組み合わせることを強く推奨する。
`git stash list` の結果を `fzf` に流し込み、選択したものを `apply` するスクリプトを組めば、もはやスタッシュの番号を意識する必要すらなくなる。
—
4. チーム開発における「スタッシュ運用」の掟
個人作業では自由だが、チーム開発では「スタッシュを放置しない」ことが信頼に繋がる。
1. スタッシュを「長期保存」しない:
- スタッシュはあくまで数分〜数時間の生存期間と心得よ。翌日まで残るスタッシュは、それはもう「コミット」であるべきだ。
2. WIP(Work In Progress)コミットの活用:
- スタッシュは共有できない。もし同僚とペアプロをするなら、スタッシュではなく `git commit -m “WIP”` を使う。これにより、別環境でも作業の続きが可能になる。
3. 設定の共有化:
- チームの `.gitconfig` は `includeIf` でディレクトリごとに読み込ませるのが鉄則だ。
.gitconfig の例
[includeIf “gitdir:~/projects/company/”]
path = ~/projects/company/.gitconfig-local
—
最後に:プロは「未完了」を愛する
優れたエンジニアは、完璧な状態を維持するのではなく、「中断から復帰するまでのセットアップ」をいかに自動化するかに命を懸けている。
`git stash` を使いこなすことは、自分の脳のメモリを解放し、目の前の課題にフルスロットルで集中するための技術だ。今日から `git stash` を単なる避難場所にするのをやめ、自分の思考の拡張パーツとして使い倒してほしい。
次回のPRで、あなたのコードがより洗練され、コンテキストスイッチのストレスが消えていることを期待している。