この記事では、Gitのgit revertコマンドについて解説します。git revertは、まるで修正テープや修正ペンのように、過去のミスを修正する手段として機能します。競合が発生した場合の対処法も少し説明します。
特定のコミットを元に戻す (git revert)
git revertはすでにリモートリポジトリにプッシュ済みのコミットを安全に元に戻すのに便利で、指定したコミットと逆操作を行うようなコミットを追加してコミットを元に戻します。
以下のようなコミット履歴を想定します。
1 2 3 4 5 6 |
~/Proj (master) $ git log --all --oneline --graph --decorate * 0f1f8a5 (HEAD -> master, origin/master) 5 commit * d242ece 4 commit * e66e132 3 commit * 70a5cc2 2 commit * 8f88b43 1 commit |
元に戻すのが簡単なコミットの場合は、git revertを用いた後、コミットメッセージを設定したらすぐに操作は完了します。
1 2 3 4 5 6 7 8 9 10 |
~/Proj (master) $ git revert 0f1f8a5 [master 65c2dea] Revert "5 commit" 1 file changed, 1 deletion(-) ~/Proj (master) $ git log --all --oneline --graph --decorate * 65c2dea (HEAD -> master) Revert "5 commit" * 0f1f8a5 (origin/master, origin/HEAD) 5 commit * d242ece 4 commit * e66e132 3 commit * 70a5cc2 2 commit * 8f88b43 1 commit |
競合がある例
前の例と同じコミット履歴を想定します。
コミットを自動で元に戻せない場合は、自分でそのコミットで実装した機能を削除等を行い、競合を解決して、コミットを元に戻す必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
~/Proj (master) $ git revert e66e132 Auto-merging file2.txt CONFLICT (content): Merge conflict in file2.txt error: e66e132をrevertできませんでした... 3 commit hint: After resolving the conflicts, mark them with hint: "git add/rm <pathspec>", then run hint: "git revert --continue". hint: You can instead skip this commit with "git revert --skip". hint: To abort and get back to the state before "git revert", hint: run "git revert --abort". ~/Proj (master|REVERTING) $ git mergetool -t vimdiff Merging: file2.txt Normal merge conflict for 'file2.txt': {local}: modified file {remote}: modified file 4 個のファイルが編集を控えています ~/Proj (master|REVERTING) $ git revert --continue [master 69d88de] Revert "3 commit" 1 file changed, 1 deletion(-) |
競合を解決したら、git revertの処理が完了します。
1 2 3 4 5 6 7 |
~/Proj (master) $ git log --all --oneline --graph --decorate * 69d88de (HEAD -> master) Revert "3 commit" * 0f1f8a5 (origin/master) 5 commit * d242ece 4 commit * e66e132 3 commit * 70a5cc2 2 commit * 8f88b43 1 commit |