Git revert
git revert
は元に戻すコマンドの一種だと考えることもできます。ただし、通常の元に戻す操作とは異なる動作をします。プロジェクト履歴において、そのコミットがなかったことにするのではなく、そのコミットによって加えられた変更を打ち消し、その結果を含む新しいコミットを追加します。これは Git の履歴を保全するためであり、バージョン履歴の完全性の維持とコラボレーションの信頼性の確保のために重要です。
「revert (打消し)」は、プロジェクト履歴からコミットを打ち消す場合に使用します。これは、バグの追跡を行った結果あるひとつのコミットが原因であることが判明した場合などに有用なコマンドです。git revert
を使用することにより、手作業で分析、修正し、その結果を新しいスナップショットとしてコミットするのではなく、それらすべてを自動的に行うことができます。
仕組み
$ mkdir git_revert_test
$ cd git_revert_test/
$ git init .
Initialized empty Git repository in /git_revert_test/.git/
$ touch demo_file
$ git add demo_file
$ git commit -am"initial commit"
[master (root-commit) 299b15f] initial commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 demo_file
$ echo "initial content" >> demo_file
$ git commit -am"add new content to demo file"
[master 3602d88] add new content to demo file
n 1 file changed, 1 insertion(+)
$ echo "prepended line content" >> demo_file
$ git commit -am"prepend content to demo file"
[master 86bb32e] prepend content to demo file
1 file changed, 1 insertion(+)
$ git log --oneline
86bb32e prepend content to demo file
3602d88 add new content to demo file
299b15f initial commit
ここでは git_revert_test
という新しく作成したディレクトリにリポジトリを作成して初期化しています。リポジトリに 3 つのコミットを作成し、そこにファイル demo_file
を追加し、ファイルのコンテンツを 2 回変更しました。リポジトリの設定手順の最後に git log
を呼び出し、コミット履歴を表示して 3 つのコミットすべてを表示します。この状態のリポジトリで git revert.
を実行する準備ができました。
$ git revert HEAD [master b9cd081] Revert "prepend content to demo file" 1 file changed, 1 deletion(-)
Git revert
はコミット ref が渡されていることを要求し、ref がなければ実行しません。ここでは HEAD
ref を渡しています。これにより直前のコミットを打ち消します。これは、コミット 3602d8815dbfa78cd37cd4d189552764b5e96c58
を打ち消す動作と同じです。打消しではマージと同様に、新しいコミットを作成すると、新しいコミットメッセージを求める新構成済みのシステムエディターが起動します。コミットメッセージを入力すると、保存した Git が動作を再開します。これで git log
を使用してリポジトリの状態を調べ、以前のログに新しいコミットが追加されていることを確認できます。
$ git log --oneline 1061e79 Revert "prepend content to demo file" 86bb32e prepend content to demo file 3602d88 add new content to demo file 299b15f initial commit
ここで、3 番目のコミットは打ち消し操作後もプロジェクト履歴に残っていることに留意してください。変更を元に戻すためにそれを削除するのではなく、git revert
によって新しいコミットを追加します。その結果として 2 番目と 4 番目のコミット後のリポジトリは全く同一の状態となり、なおかつ 3 番目のコミットは履歴に残っているため、その時点に戻ることも可能です。
よく使われるオプション
-e
--edit
デフォルトのオプションで、指定不要です。このオプションを使うと構成済みのシステム エディターが開き、打ち消しをコミットする前にコミット メッセージを編集するよう求められます。
--no-edit
-e
オプションを打ち消します。打ち消し操作ではエディターは開きません。
-n
--no-commit
取消しと打消し
git revert
は、1 つのコミットのみを元に戻すコマンドであることをしっかりと理解してください。そのコミットの後に行われたすべてのコミットを削除することによってプロジェクトを以前の状態に「戻す」コマンドではありません。Git では以前の状態に戻すコマンドは reset (取消し) であり、revert (打消し) ではありません。