#はじめに
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 で複数コミットを打ち消す