[{"data":1,"prerenderedAt":541},["ShallowReactive",2],{"content-/2026-05-03-git-stash-branch-merge-workflow":3,"all-pages-for-dir":539,"og-image-/2026-05-03-git-stash-branch-merge-workflow":540},{"id":4,"title":5,"body":6,"category":521,"description":522,"extension":523,"meta":524,"navigation":147,"path":525,"project_name":526,"published":527,"publishedAt":528,"seo":529,"stem":530,"tags":531,"todo":537,"updatedAt":537,"__hash__":538},"pages/2026-05/2026-05-03/git-stash-branch-merge-workflow.md","ブランチ跨ぎでmemoが消えたと焦った話。stash→branch切替→マージ→PR作成までを順次実行",{"type":7,"value":8,"toc":509},"minimark",[9,31,34,37,41,51,83,86,90,93,353,360,363,372,379,394,398,405,408,418,421,425,431,443,446,493,496,502,505],[10,11,12,13,17,18,21,22,30],"p",{},"朝、case100 の作業を再開しようとして ",[14,15,16],"code",{},"memo/2026-05-03/"," を開いたら、昨日まで書いていたメモが消えていた。一瞬手が止まって背筋が冷えたが、",[14,19,20],{},"git status"," を叩いたら原因はすぐに割れた。",[23,24,25,26,29],"strong",{},"メインブランチで作業しているつもりが、実際には ",[14,27,28],{},"fix/e2e-stabilize-wait"," というブランチに乗ったまま昨日の作業を終えていて","、main に戻ってきたらそのブランチで作ったファイルが視界から消えていた、というだけの話だった。",[10,32,33],{},"ファイルは消えていない。git の中で別のブランチに居る。それを思い出すまでに10秒くらい固まった。",[10,35,36],{},"今日はこの「ブランチ跨ぎで起きた錯覚 → 状態整理 → PR #16 を main にマージするまで」のワークフローを、Claude Code に手順を組ませて順次実行した記録を残す。",[38,39,40],"h2",{"id":40},"状況の整理",[10,42,43,44,46,47,50],{},"朝イチで ",[14,45,20],{}," と ",[14,48,49],{},"git log --oneline --all --graph"," を叩いて、頭の中の地図を描き直した。",[52,53,54,62,71,74],"ul",{},[55,56,57,58,61],"li",{},"現在 ",[14,59,60],{},"main"," に居る",[55,63,64,66,67,70],{},[14,65,28],{}," が main より ",[23,68,69],{},"11コミット先行","している（case100 関連の作業はすべてこちら側）",[55,72,73],{},"一方で main にも未コミットの変更がある（並行で開いた別セッションで触ったファイル群）",[55,75,76,77,79,80,82],{},"「memoが消えた」のは、",[14,78,28],{}," で作っていた ",[14,81,16],{}," がまだ main に来ていないだけ",[10,84,85],{},"ここまで見えれば手順は組める。データ消失の心配は基本ない。Git は未コミット変更を上書きしそうな時は警告でブロックしてくれる。",[38,87,89],{"id":88},"ワークフロー案a順次実行","ワークフロー（案A：順次実行）",[10,91,92],{},"Claude Code に「次の手順で進めて」と渡したのは以下の流れ。",[94,95,100],"pre",{"className":96,"code":97,"language":98,"meta":99,"style":99},"language-bash shiki shiki-themes vitesse-light vitesse-light","# 1. main の未コミット変更を退避（untracked も含めるため -u フラグ）\ngit stash push -u -m \"main work in progress before switching\"\n\n# 2. main を最新化\ngit pull --ff-only origin main\n\n# 3. fix/e2e-stabilize-wait に切り替え、main を取り込む\ngit checkout fix/e2e-stabilize-wait\ngit merge main\n\n# 4. push\ngit push origin fix/e2e-stabilize-wait\n\n# 5. PR 作成（本文素案を提示してから実行）\ngh pr create --title \"...\" --body \"...\"\n\n# 6. CI 緑確認 → ユーザーが GitHub UI で Squash & Merge\n# （ここで一旦止める）\n\n# 7. main に戻して fetch、stash 復元\ngit checkout main\ngit pull --ff-only origin main\ngit stash pop\n\n# 8. ローカルブランチを削除\ngit branch -d fix/e2e-stabilize-wait\n","bash","",[14,101,102,111,142,149,155,172,177,183,194,204,209,215,226,231,237,269,274,280,286,291,297,306,319,329,334,340],{"__ignoreMap":99},[103,104,107],"span",{"class":105,"line":106},"line",1,[103,108,110],{"class":109},"sxvE3","# 1. main の未コミット変更を退避（untracked も含めるため -u フラグ）\n",[103,112,114,118,122,125,129,132,136,139],{"class":105,"line":113},2,[103,115,117],{"class":116},"senZ8","git",[103,119,121],{"class":120},"sdGka"," stash",[103,123,124],{"class":120}," push",[103,126,128],{"class":127},"snbK4"," -u",[103,130,131],{"class":127}," -m",[103,133,135],{"class":134},"sMJiu"," \"",[103,137,138],{"class":120},"main work in progress before switching",[103,140,141],{"class":134},"\"\n",[103,143,145],{"class":105,"line":144},3,[103,146,148],{"emptyLinePlaceholder":147},true,"\n",[103,150,152],{"class":105,"line":151},4,[103,153,154],{"class":109},"# 2. main を最新化\n",[103,156,158,160,163,166,169],{"class":105,"line":157},5,[103,159,117],{"class":116},[103,161,162],{"class":120}," pull",[103,164,165],{"class":127}," --ff-only",[103,167,168],{"class":120}," origin",[103,170,171],{"class":120}," main\n",[103,173,175],{"class":105,"line":174},6,[103,176,148],{"emptyLinePlaceholder":147},[103,178,180],{"class":105,"line":179},7,[103,181,182],{"class":109},"# 3. fix/e2e-stabilize-wait に切り替え、main を取り込む\n",[103,184,186,188,191],{"class":105,"line":185},8,[103,187,117],{"class":116},[103,189,190],{"class":120}," checkout",[103,192,193],{"class":120}," fix/e2e-stabilize-wait\n",[103,195,197,199,202],{"class":105,"line":196},9,[103,198,117],{"class":116},[103,200,201],{"class":120}," merge",[103,203,171],{"class":120},[103,205,207],{"class":105,"line":206},10,[103,208,148],{"emptyLinePlaceholder":147},[103,210,212],{"class":105,"line":211},11,[103,213,214],{"class":109},"# 4. push\n",[103,216,218,220,222,224],{"class":105,"line":217},12,[103,219,117],{"class":116},[103,221,124],{"class":120},[103,223,168],{"class":120},[103,225,193],{"class":120},[103,227,229],{"class":105,"line":228},13,[103,230,148],{"emptyLinePlaceholder":147},[103,232,234],{"class":105,"line":233},14,[103,235,236],{"class":109},"# 5. PR 作成（本文素案を提示してから実行）\n",[103,238,240,243,246,249,252,254,257,260,263,265,267],{"class":105,"line":239},15,[103,241,242],{"class":116},"gh",[103,244,245],{"class":120}," pr",[103,247,248],{"class":120}," create",[103,250,251],{"class":127}," --title",[103,253,135],{"class":134},[103,255,256],{"class":120},"...",[103,258,259],{"class":134},"\"",[103,261,262],{"class":127}," --body",[103,264,135],{"class":134},[103,266,256],{"class":120},[103,268,141],{"class":134},[103,270,272],{"class":105,"line":271},16,[103,273,148],{"emptyLinePlaceholder":147},[103,275,277],{"class":105,"line":276},17,[103,278,279],{"class":109},"# 6. CI 緑確認 → ユーザーが GitHub UI で Squash & Merge\n",[103,281,283],{"class":105,"line":282},18,[103,284,285],{"class":109},"# （ここで一旦止める）\n",[103,287,289],{"class":105,"line":288},19,[103,290,148],{"emptyLinePlaceholder":147},[103,292,294],{"class":105,"line":293},20,[103,295,296],{"class":109},"# 7. main に戻して fetch、stash 復元\n",[103,298,300,302,304],{"class":105,"line":299},21,[103,301,117],{"class":116},[103,303,190],{"class":120},[103,305,171],{"class":120},[103,307,309,311,313,315,317],{"class":105,"line":308},22,[103,310,117],{"class":116},[103,312,162],{"class":120},[103,314,165],{"class":127},[103,316,168],{"class":120},[103,318,171],{"class":120},[103,320,322,324,326],{"class":105,"line":321},23,[103,323,117],{"class":116},[103,325,121],{"class":120},[103,327,328],{"class":120}," pop\n",[103,330,332],{"class":105,"line":331},24,[103,333,148],{"emptyLinePlaceholder":147},[103,335,337],{"class":105,"line":336},25,[103,338,339],{"class":109},"# 8. ローカルブランチを削除\n",[103,341,343,345,348,351],{"class":105,"line":342},26,[103,344,117],{"class":116},[103,346,347],{"class":120}," branch",[103,349,350],{"class":127}," -d",[103,352,193],{"class":120},[10,354,355,356,359],{},"ポイントは ",[23,357,358],{},"5番と6番の境界で必ず止めること","。リモートに見える操作（push、PR作成、マージ）は、各境界で手を止めてユーザーが目視確認する運用にしている。AI が「勢いでマージまで」やってしまうと取り返しがつかない。",[38,361,362],{"id":362},"試行錯誤と気づき",[364,365,367,368,371],"h3",{"id":366},"_1-git-checkout-が権限プロンプトで弾かれた","1. ",[14,369,370],{},"git checkout"," が権限プロンプトで弾かれた",[10,373,374,375,378],{},"3番の ",[14,376,377],{},"git checkout fix/e2e-stabilize-wait"," で Claude Code が拒否された。プロジェクトの設定で許可されていないコマンドだったらしい。リトライしても同じところで止まる。",[10,380,381,382,385,386,393],{},"ここはユーザー側で ",[14,383,384],{},"!git checkout fix/e2e-stabilize-wait"," を手で打ち、Claude Code に作業を返した。",[23,387,388,389,392],{},"権限で詰まったらユーザー手動実行（",[14,390,391],{},"!command"," 形式）でカバーできる","、という運用は覚えておいて損がない。Claude Code 側に全部やらせようとして無理に権限を緩めるより、人間がワンショットで打つ方が早い場面は多い。",[364,395,397],{"id":396},"_2-stash-復元で差分が消えたように見えた","2. stash 復元で「差分が消えた」ように見えた",[10,399,400,401,404],{},"一番焦ったのが7番の ",[14,402,403],{},"git stash pop","。",[10,406,407],{},"main に戻って stash を復元したら、ほとんどのファイルで差分が出てこなかった。「あれ、stash の中身どこ行った？」と画面を凝視した。",[10,409,410,411,414,415,417],{},"種を明かすと、",[23,412,413],{},"stash に入れていた変更の大半は PR #16 のコミットにすでに含まれていた","。並行セッションで触っていたファイルが、",[14,416,28],{}," 側でも同じように編集されていて、Squash & Merge で main に取り込まれた瞬間に「stash の中身 = main の現在の状態」になり、差分がゼロになっていた。",[10,419,420],{},"つまり差分消失は no-op、これは正しい挙動。同期が完了している証拠だった。git は淡々と「同じ内容なので適用するものがありません」と言っているだけ。",[364,422,424],{"id":423},"_3-memo-が消えたのはマージ直後のキャッシュ","3. memo が「消えた」のはマージ直後のキャッシュ",[10,426,427,428,430],{},"そもそもの発端だった「memoが消えた」も、PR #16 のマージ直後にエクスプローラーが古い状態を表示していただけだった。git の状態を見たら、",[14,429,16],{}," のファイル群はすべて main に入っていた。",[10,432,433,442],{},[23,434,435,436,46,438,441],{},"ファイルが見えない時はまずエクスプローラーを信じず、",[14,437,20],{},[14,439,440],{},"git log -- memo/2026-05-03/"," を叩く","。これに尽きる。",[38,444,445],{"id":445},"学んだこと",[52,447,448,455,465,473,479,490],{},[55,449,450,451,454],{},"ブランチを跨いで並行作業していると、目に見えるファイルが切り替わる。「消えた」と感じたら、まず ",[14,452,453],{},"git branch"," で今どこに居るかを確認する",[55,456,457,460,461,464],{},[14,458,459],{},"git stash"," は untracked を含めるなら ",[14,462,463],{},"-u"," フラグを忘れない。これを忘れると新規ファイルだけ取り残されてもう一度焦る",[55,466,467,469,470,472],{},[14,468,60],{}," と作業ブランチを並走させるときは、こまめに ",[14,471,20],{}," で位置を取る。30分に1回見るだけでも錯覚は消える",[55,474,475,476,478],{},"Claude Code が権限プロンプトで止まったら、ユーザーが ",[14,477,391],{}," で手動実行して作業を返す運用が回る。AI に全権を渡そうとしない",[55,480,481,482,485,486,489],{},"stash 復元で差分が消えても、それは同期完了の合図のことが多い。慌てて ",[14,483,484],{},"git stash drop"," する前に ",[14,487,488],{},"git log"," を見る",[55,491,492],{},"リモートに見える操作（push、PR作成、マージ）は各境界で必ず手を止める。順次実行と自動実行は別物",[38,494,495],{"id":495},"結果",[10,497,498,499,501],{},"PR #16 は無事 Squash & Merge で main に入り、",[14,500,28],{}," ローカルブランチも削除した。main は最新化され、case100 関連の11コミット分の作業が main に取り込まれた状態になった。",[10,503,504],{},"朝の「memoが消えた」事案は10秒で錯覚と判明し、そこから30分でPRマージと後片付けまで終わった。Claude Code に手順を組ませて段階ごとに止めながら進める運用は、こういう「複数ブランチを跨いだ整理作業」と相性がいい。次に同じ場面が来たら、もう一度この記事を見返す。",[506,507,508],"style",{},"html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":99,"searchDepth":113,"depth":113,"links":510},[511,512,513,519,520],{"id":40,"depth":113,"text":40},{"id":88,"depth":113,"text":89},{"id":362,"depth":113,"text":362,"children":514},[515,517,518],{"id":366,"depth":144,"text":516},"1. git checkout が権限プロンプトで弾かれた",{"id":396,"depth":144,"text":397},{"id":423,"depth":144,"text":424},{"id":445,"depth":113,"text":445},{"id":495,"depth":113,"text":495},"dev","case100作業中に main と fix/e2e-stabilize-wait を跨いでmemoが消えたように見えた事案。stash→ブランチ切替→マージ→push→PR作成→マージ→stash復元までのワークフローをClaude Codeに組ませて整理","md",{},"/2026-05-03-git-stash-branch-merge-workflow","eurekapu-nuxt4",false,"2026-05-03T00:00:00.000Z",{"title":5,"description":522},"2026-05/2026-05-03/git-stash-branch-merge-workflow",[532,533,534,535,536],"Git","stash","ブランチ","PR","Claude Code",null,"Hp8vDipxyl_Im_tPSYlOXwhew5rDKophWmpfvNhqHPs",[],"https://log.eurekapu.com/favicon.svg",1778379990305]