Git revertとresetについて


はじめに

Gitのコマンド、reset、revertの内容や使用ケース、違いについてまとめます。

reset

現在のHEADを指定された状態にリセットすることです。
付与するオプションによってインデックス、ワーキングツリーの内容も変更することができ、
取り消したことはコミットログとして残りません。

【イメージ図】

使用ケース

(1)直前のコミットを取り消したい

$ git reset --hard HEAD^

(2)n個前のコミットまで戻したい

git reset ---hard HEAD~n

(※)誤ってresetをしてしまった場合

$ git reset --hard ORIG_HEAD

オプションその他

  • HEAD^:直前のコミットを表す
  • HEAD~{n} :{n}個前のコミットを表す

resetには--mixed--soft--hardの3つのオプションが存在し、それぞれリセットされる内容が異なります。

オプション名 HEAD位置 インデックス ワーキングツリー
--mixed(デフォルト) リセット リセット リセットされない
--soft リセット リセットされない リセットされない
--hard リセット リセット リセット

revert

指定したコミットハッシュを打ち消すコミットを新たに行うことです。
(オプション-nを指定しない限り、自動的にコミットされます)
「逆向きのコミット」と言われており、打ち消したこともコミットログとして残ります。

【イメージ図】

上記のイメージ画像の例だと、最新の状態Cに対して、コミットBの処理内容のみを打ち消すコミットB'を作成しています。

使用ケース

(1)直前のコミットを打ち消したい

git revert <対象のコミットID>

(※)コミットメッセージの編集

  • 編集したい
$ git revert <対象のコミットID> -e

または

git revert <対象のコミットID> --edit
  • 編集したくない
git revert <対象のコミットID> --no-edit

(2)まとめて複数のコミットを打ち消したい

git revert -n <対象のコミットID>
git revert -n <対象のコミットID>
      ・
      ・
      ・
git commit
  • nオプション(no edit):自動コミットせずにrevertする

(3)範囲を指定して打ち消したい

git revert <対象のコミットID A>..<対象のコミットID B>

「..」を使用して、打ち消したい対象範囲のコミットの先頭、末尾を時系列で指定します。
revertされるのは先頭(A)の直後のコミットとなり、先頭(A)自体は含みません。

(4)マージコミットを取り消したい

$ git revert -m 1 <対象のマージコミットID>

revertしようとしたコミットがマージコミットだった場合には、m(mainlineオプション)をつける必要があります。
また、マージコミットを取り消す場合には、マージした2つのコミット(親)のうちどちらに戻すのかを指定する必要があり、1が「マージされた側のブランチ」、2が「マージする側のブランチ」という意味合いになります。

  • mオプション(mainline):マージコミットを打ち消す場合に使用

(※)revertのやり直し

git revert --abort

オプションその他

  • HEAD^:直前のコミットを表す
  • HEAD~{n} :{n}個前のコミットを表す
オプション名 内容
--no-edit コミットメッセージを編集しない
-e
--edit
コミットメッセージを編集する(※デフォルト)
-m
--mainline
マージコミットを打消す
打ち消す際にはどちらのブランチに戻すかを指定する
-n
--no-commit
自動コミットせずにrevertする
--abort revertを取り消す
--help コマンドのヘルプを表示

まとめ

  • resetとrevertのメリット、デメリット

    • reset
      • メリット
        ・誤ったコミット自体を削除出来るのでコミットログが見やすい
        ・HEADの位置を大幅に移動することができる

      • デメリット
        ・チームで開発にて他の人が同じブランチで作業していた場合に、コンフリクトがおきたり、エラー発生の原因となる可能性がある
        ・コミット自体を削除してしまうため、復元作業に少し手間がかかる

    • revert
      • メリット
        ・コミット自体を削除するわけではないので、安全にコミットを元に戻すことができる
        ・誤った履歴が残ることでrevert事態の取り消しも容易に行うことができる

      • デメリット
        ・誤った履歴が残ってしまうので、コミットログが見づらくなる
  • resetとrevertの使い分け
    前述のメリット、デメリットを踏まえると・・・

    • reset
      個人開発に向いている

    • revert
      チーム開発に向いている

参考ページ

mainlineオプションについて
git reset についてのまとめ
git revertについて
git revert で複数コミットを打ち消す