- 公開日
- 最終更新日
【Git】git revertを攻略してみる
この記事を共有する
目次
はじめに
こんにちは、サービスGの佐藤です。
今回はGitでのちょっとした学びということで、
git revertコマンドについてまとめていきたいと思います。
後述しますが、コミットを削除するような動きとなるのでgit resetと混同されがちですが、
git revertはより安全な動きとなり、こちらも比較しながらまとめていければと思います!
git revertの挙動
特定コミット(更新履歴)について打ち消すことができます。 具体的には以下の利用場面があるかと思います。
- mainブランチに誤ったコミットをプッシュしてしまった。
- 意図しないブランチをマージしてしまった。
- 特定の実装部分を削除したい。
たとえば以下のようなコミット履歴があるとします。

ここでBのコミットはやはりいらないとなった場合、 そこだけ削除することが可能となり、以下のような内容に変更されます。

git revertのメリット
履歴がのこせる
以下、図のようにコミットとしてrevertした形跡がのこるため、 履歴として追いやすい形とすることが可能です。

コミットを復活させることができる
これまであえて打ち消すという表現をし、削除という表現はしていませんでした。 revertのコミットに対しさらにrevertをすることでコミットを復活させるといった動きが可能となるためです。
例えば、システム障害切り分けで一部機能を一旦削除するようなことが可能となります。
※機能をコミットでわけることができている場合。
上記の図で言うと、Bがその対象となります。
ハンズオン
コミットの復活部分について、実際に動きを確認してみたいと思います。 以下ようなテキストファイルを用意しました。
コミットAでの記載
コミットBでの記載
コミットCでの記載
コミットDでの記載
コミットBの部分を対象に実施していきます。
①コミット履歴を確認
reflogでコミットIDを検索します。
$ git reflog
390fb87 (HEAD -> 20251122, origin/20251122) HEAD@{0}: commit: commitD
b786546 HEAD@{1}: commit (amend): commitC
028d9a1 HEAD@{2}: commit: commitB
71ba182 HEAD@{3}: commit: commitB
a0f1953 HEAD@{4}: commit: commitA
②対象コミットのrevert
$ git revert 71ba182
Auto-merging revertFile.txt
CONFLICT (content): Merge conflict in revertFile.txt
error: could not revert 71ba182... commitB
同じファイル(箇所)に対しての変更となるためコンフリクトが発生しました。 こちら手動で解消し、以下内容に修正します。
コミットAでの記載
コミットCでの記載
コミットDでの記載
修正後、コミットします。
$git commit
[20251122 8561ec7] Revert "commitB"
tips
今回は自身のブランチでコミットしたものを取り消していますが、 他ブランチよりマージしたコミットについては以下のようなオプションが必要になります。
git revert -m 1 <マージコミットのハッシュ>
③revertのコミットを確認
$ git reflog
8561ec7 (HEAD -> 20251122, origin/20251122) HEAD@{0}: commit: Revert "commitB"
390fb87 HEAD@{1}: reset: moving to HEAD
390fb87 HEAD@{2}: commit: commitD
b786546 HEAD@{3}: commit (amend): commitC
028d9a1 HEAD@{4}: commit: commitB
71ba182 HEAD@{5}: commit: commitB
a0f1953 HEAD@{6}: commit: commitA
ファイル内容と合わせてログにrevertの履歴が確認できました。
④③のコミットをrevert
それではrevertしたcommitに対してさらにrevertしていきます。
$ git revert 8561ec7
[20251122 9f0d398] Reapply "commitB"
$ git reflog
9f0d398 (HEAD -> 20251122) HEAD@{0}: revert: Reapply "commitB"
8561ec7 (origin/20251122) HEAD@{1}: commit: Revert "commitB"
390fb87 HEAD@{2}: reset: moving to HEAD
390fb87 HEAD@{3}: commit: commitD
b786546 HEAD@{4}: commit (amend): commitC
028d9a1 HEAD@{5}: commit: commitB
71ba182 HEAD@{6}: commit: commitB
a0f1953 HEAD@{7}: commit: commitA
$ cat revertFile.txt
コミットAでの記載
コミットBでの記載
コミットCでの記載
コミットDでの記載
最終的にもとにもどっていることがわかります。
git resetとの違い
対してgit resetも過去のコミットを読み戻す意味では似ているように思われますが、
さかのぼった分のコミットは削除することとなります。
下記の例の場合、コミットC,Dは削除されてしまうこととなります。
※--soft / --mixed / --hard モードによって削除範囲が変わりますが、割愛します。
git revert

git reset

また、履歴をさかのぼる動きとなるので、 履歴が残らず、詳細を追うことが難しくなります。
$ git reset --hard 71ba182
HEAD is now at 71ba182 commitB
git Graphで確認するとわかりやすく、 コミットがBまでさかのぼっています。

まとめ
いかがだったでしょうか。
Git は強力なツールですが、そのコマンドがどのように履歴を操作するのかを理解していないと、
意図しない結果やトラブルにつながることがあるので、
一つ一つの動きを理解しながら、安心して使いこなしていきたいです。
この記事は私が書きました
佐藤 祐弥
記事一覧日々の業務上での学びをコツコツアウトプットできればなと思います。