Hack Your Design!

githubにgit pushした変更の取り消し

(image)githubにgit pushした変更の取り消し

「間違ったコミットをリモートにpushしちゃった!取り消したい!」ってときの操作。上イメージのようにgithubに誤ったpushをした場合を想定して解説してみます。

下記コマンド打つ。

$ git rebase -i HEAD~2

HEAD~2は「直前の2つのコミットを修正対象とする」という意味になります。3つ前のコミットを取り消したい場合はHEAD~3としてください。するとこんな画面が出てくる。

取り消したいコミットを削除して保存します。この場合、2行目のコミットが誤りなので2行目を削除して保存します。うまくいくとこんなメッセージ。

Successfully rebased and updated refs/heads/master.

これで準備はOK。でも、その状態で普通にプッシュするとこんなエラーで受け付けてくれない。

$ git push
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'xxxx"

これは一度リモートにpushした変更を書き換えようとしているためにrejectされています。今回の場合、この変更は意図したものなので-fオプションを付けて強制的にpushします。

$ g push -f
+ 4f82199...2778ead master -> master (forced update)

以上になります。

ローカルの変更を残したい場合...

上手順を行うと、リモートの変更も失われますしローカル上の変更も失われます。ローカル上のコミットを残して、githubのpushを取り消したいときは下記のコマンド。

$ git push -f origin HEAD^:master
 + 91700fc...2778ead HEAD^ -> master (forced update)

上記の場合、HEAD^(最新の状態から1つ前の状態)へと強制pushしているので、最新コミットの1つがgithubから失われます。

参考

  • このエントリーをはてなブックマークに追加