ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

【Git】git revertを攻略してみる

この記事を共有する

目次

はじめに

こんにちは、サービスGの佐藤です。
今回はGitでのちょっとした学びということで、 git revertコマンドについてまとめていきたいと思います。

後述しますが、コミットを削除するような動きとなるのでgit resetと混同されがちですが、
git revertはより安全な動きとなり、こちらも比較しながらまとめていければと思います!

git revertの挙動

特定コミット(更新履歴)について打ち消すことができます。 具体的には以下の利用場面があるかと思います。

  • mainブランチに誤ったコミットをプッシュしてしまった。
  • 意図しないブランチをマージしてしまった。
  • 特定の実装部分を削除したい。

たとえば以下のようなコミット履歴があるとします。

スクリーンショット 2025-11-20 224423.png

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

スクリーンショット 2025-11-20 224431.png

git revertのメリット

履歴がのこせる

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

スクリーンショット 2025-11-20 224439.png

コミットを復活させることができる

これまであえて打ち消すという表現をし、削除という表現はしていませんでした。 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

スクリーンショット 2025-11-22 175600.png

git reset

スクリーンショット 2025-11-22 175607.png

また、履歴をさかのぼる動きとなるので、 履歴が残らず、詳細を追うことが難しくなります。

$ git reset --hard 71ba182
HEAD is now at 71ba182 commitB

git Graphで確認するとわかりやすく、 コミットがBまでさかのぼっています。

スクリーンショット 2025-11-22 181330.png

まとめ

いかがだったでしょうか。 Git は強力なツールですが、そのコマンドがどのように履歴を操作するのかを理解していないと、 意図しない結果やトラブルにつながることがあるので、
一つ一つの動きを理解しながら、安心して使いこなしていきたいです。

この記事は私が書きました

佐藤 祐弥

記事一覧

日々の業務上での学びをコツコツアウトプットできればなと思います。

佐藤 祐弥

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。