はじめに
以前、アプリ開発に取り組んでいるときに、直前にコミットした操作に誤りが見つかり、コミットを取り消したいということがあったのですが...
どうやってコミットの履歴を消すのか分かりませんでした。
ネットで調べていくと、GitHubのコマンドには、revertコマンド
とresetコマンド
というものがあることを発見。
しかしよくよく説明を読むにつれて、これらのコマンドを使用する際は、落とし穴にはまる危険性が高い、と思いました。
備忘録も兼ねてアウトプットします!!
revertコマンドについて
反対の内容で新規コミットを作成し、過去のコミットを打ち消すためのコマンドです。
新しくコミットを追加しているだけであり、既存コミットの履歴がGitHub上から消えることはありません。
よって、後述するresetコマンド
と比較すると、安全なコマンドと言えるでしょう。
使用方法
通常は以下のコマンドを打ち込むと、自動コミットという流れになります。
コマンド入力後に自動でエディタが開くので、コミットメッセージを併せて入力する形です。
$ git revert <commit> -e
または
$ git revert <commit> --edit
逆に、新規コミットしない方法もあります。
$ git revert <commit> -n
または
$ git revert <commit> --no-edit
コミットメッセージなしでrevert
できます。
resetコマンドについて
revertコマンド
と違い、現在のHEADを指定された状態にリセットするコマンドです。
指定したコミット以降に行われた処理を全て元の状態に戻します。
しかし、その戻したということ自体、コミットログには一切記録が残りません。
よって、チーム開発などで使用することは、極めてリスキーなコマンドです。
使用方法
直前のコミットを元の状態に戻すとき
$ git reset --hard HEAD^
n個前のコミットまで戻すとき
$ git reset ---hard HEAD~n
resetコマンドのオプション
上記で使用している--hard
を含め、いくつかのオプションが存在します。
オプション名 | インデックス | ワーキングツリー |
---|---|---|
--mixed(デフォルト) | リセット | リセットされない |
--soft | リセットされない | リセットされない |
--hard | リセット | リセット |
おわりに
GitHubでコミットやプッシュのミスに気がついた時は、かなり焦ることが多いですよね。
そんな万が一の際に、慌てふためくことのないように、こういったイレギュラーな処理にも慣れていきたいと思いました。