🧊

gitで違うbranchにpushしちゃった!の対応

いやー、すみません!
ミスってまったく関係ない違うブランチにプッシュしてしまった!やばい!という時の対応。

以下、事故ログ。

  • 作業中の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も晴れて元通り!

いやー、よかったよかった・・。