いやー、すみません!
ミスってまったく関係ない違うブランチにプッシュしてしまった!やばい!という時の対応。
以下、事故ログ。
- 作業中のbranchAでcommit1
- 作業中のbranchAでcommit2
- 作業中のbranchAでcommit3
- pushするためにfetch
- 関係ない本流branchMに誤ってpush
はじめに
以下に示すのは、今回たまたま通用した手順であって、どんな場合でもベストというわけではないと思います。
実はもっとナイスな回避手段があったのかもしれない。
まずは現況復帰
とりいそぎbranchMへのpushを遮断する
そんなコマンドないので、開発メンバーに連絡。
ほんとすみません!
手元の変更を退避
今回の手段に選ばれたのは、
誤ったpushで詰まれたコミットたちを、「なかったことにする」コミットを積む作戦。
そのために、手元の変更を一旦逃します。
git checkout -b temp git checkout branchA
ターゲット指定なしなので、今いるbranchAから。
そして事件現場へ戻る。
なかったことにするコミット
git log
なかったことにしたいコミットたちのハッシュを確認&メモ。
git revert -n commit3のハッシュ git revert -n commit2のハッシュ git revert -n commit1のハッシュ
「新しいコミットから」順にrevertする。
- nオプション(--no-commit)は、とりあえず差分が発生する状態に戻すだけ。
git commit
そしたらなかった状態をコミット。
git push origin branchM
pushできたら本流は元通り!
開発メンバーにもう一声
お待たせしました!作業完了っす!
ここからが本来のお仕事
汚れたブランチを捨てる
git checkout branchM git branch -d branchA git checkout -b branchA
いったん手元のbranchAを消して、新たに生み出します。
退避させたコミットを反映させる
さっき逃したコミットたちを、今生まれたbranchAに戻します。
git cherry-pick commit1のハッシュ git cherry-pick commit2のハッシュ git cherry-pick commit3のハッシュ
今度は古い順。
cherry-pickでコミットしないようにするには、同じく-nオプションを使うらしいがどっちでもよさげ。
git push origin branchA
これでbranchAも晴れて元通り!
いやー、よかったよかった・・。