Skip to content
blog.kenichikat.me
Go back

マージ済みブランチで作業を始めてしまったときの直し方

すでにPRを出してマージまで終わっているブランチの上で、そのまま次の作業を始めてしまった。作業ツリーには未コミットの変更が残っている状態で気づいたので、mainを最新化した新しいブランチへ移し替えた。

状況

手順

  1. git stash push で該当ファイルの変更だけを退避する

    git stash push -m "WIP" -- src/utils/example.ts
  2. main をfetch・pullして最新化する(マージ済みのPRの内容もここで取り込まれる)

    git switch main
    git pull origin main
  3. 最新化した main から新しいブランチを作成する

    git switch -c feature/simplify-pr-template
  4. 退避しておいた変更を戻す

    git stash pop

これで、最新のmainを土台にした新しいブランチ feature/simplify-pr-templateの上に、編集中だった変更だけが乗った状態になる。

git stash pushで何が起きているか

「一時領域に退避する」というイメージだが、実体は特別な退避スペースがあるわけではなく、変更内容を通常のcommitオブジェクトとして保存する仕組み。

つまり通常のブランチ履歴(refs/heads/*)とは別のrefs/stashというポインタに、変更内容をコミットとして積んでいるだけ。git stash listで一覧を確認でき、git stash popで最新の退避内容を作業ツリーに戻して積んだ分を消費し、git stash applyなら消費せず適用だけできる。

今回のようにstash push -- <path>とパスを指定すると、そのパスに一致する変更だけを対象にコミットを作り、他の変更はワーキングツリーに残したまま退避できる。

コマンド中の--について

stash push -m "..." -- <path>--は、多くのCLIコマンドに共通する慣習で「これより後ろはオプションではなく引数として扱う」という区切りを明示するもの。

git checkout -- <file>git diff -- <file>など、パスを指定する他のgitコマンドでも同じ意味で使われる。パス指定を伴うコマンドでは慣習的に--を挟んでおくと安全。

メモ


Share this post on:

Previous Post
commitlintでConventional Commitsを強制する設定を調べた
Next Post
tmuxでmacOSのクリップボードと連携するコピペ設定