iimon TECH BLOG

iimonエンジニアが得られた経験や知識を共有して世の中をイイモンにしていくためのブログです

git revert について

iimonでフロントエンジニアを担当している齋藤です。

実務で誤った修正をpushしてしまい、慣れてないgit revertを使用したので 自分用の備忘録として残します

■git revertとは


反対の内容で新規コミットを作成することで、過去のコミットを打ち消せる。

あくまで過去のコミット自体を削除するわけではなく、反対の内容で新規コミットを作成することで過去の変更を打ち消すことができる

イメージ

コミット履歴(A~C)のBコミットの内容を消したくてgit revert B してもコミットBは消えない。

コミットBの内容を削除した状態の新しいコミットB’が生成されます

A--B--C

A--B--C--B’

■どのような場合に使う?


  1. 修正が必要なコミットがある場合

  →修正が必要な特定のコミットだけ取り消せる

  1. 間違ったブランチにコミットした場合
  2. そもそも無関係な変更を取り消す場合
  3. revertしたコミットを戻す場合

■メリット、デメリット


メリット

  1. コミット履歴を保持

    →誤った修正をなかったことにせずに、その後の修正内容と共にリポジトリの履歴に残るため、追跡などがしやすくなる。(主にチーム開発では重要)また、revertコミットの取り消しも容易に行いやすい。

  2. 安全な操作性

    →コミット自体を削除するわけではないので、安全にコミットを元に戻せたり、リポジトリの 履歴を変更するわけではないのでgit resetとは異なり、他の開発者が既にリモートリポジトリにプッシュしている場合でも安全に使用できる。

  3. 複数のコミットをまとめて取り消せる

    →複数のコミットをまとめて取り消すことができるため、個々のコミットを手動で修正する必要がない。

デメリット

  1. 履歴が複雑になる

    誤ったコミットを新しいコミットとして追加するので履歴が複雑になり、リポジトリの履歴を読み解くことが難しくなる。

■git resetとは


コミットの内容を変更できる点でgit revertとよく比べられるコマンド いらなくなったコミットを捨てることができ、現在のHEADを指定された状態にリセットできる。

取り消したことはログに残らないのでチーム開発で使用するときは注意が必要。なので個人開発向け。

また、チーム開発で他の人が同じブランチで作業していた場合に履歴を変更するためコンフリクトが起こる可能性が高くなる。履歴を整理する際などに便利。

●使い方

コマンド

git reset ~~HEAD

resetにはsoft、mixed、hardの3つのオプションが存在しており、それぞれリセットされる内容が異なる。

どれもHEADの位置は変える

中でもhardオプションはそのコミット以降の変更を完全に削除するので回復が難しく注意が必要

コマンドを使用しない場合はmixedが適用される。 https://murank.hatenadiary.org/entry/20110327/1301224770 https://codelikes.com/git-reset/#toc5

〜HEADとは 

gitにおけるHEADとは現在のブランチが指している最新のコミットのこと

HEADについて分かりやすくまとめられています↓ https://backlog.com/ja/git-tutorial/stepup/03/ https://tmytokai.github.io/open-ed/activity/git/text01/page04.html

■実際にgit revertを使ってみる

  1. まずはファイルを作成して、文を追記してコミットをする

    `git log -p` でコミット内容を見る
    

文を追加しますという文言を追加しました。(画像ではコミットメッセージがgit revert)

  1. git revertをする。

    反対のコミットを作成する。コミットのハッシュ値を指定してコマンドを叩きます。

    今回のハッシュ値212b41fc2503059efbcd5fc8d689f2b86f21c324なのでgit revert 212b41fc2503059efbcd5fc8d689f2b86f21c324 を叩きます。

ここでvimでメッセージを入力して保存します。

3.反対の内容でコミットが作成されているかを確認

先程の文を追加しますというメッセージを削除。先程のコミットと反対の内容でコミットを作成していることがわかります。

こちらの例はマージしていないコミットを打ち消す例。

●マージしたコミットに対して

マージしたコミットを打ち消す場合には、ほぼ同じですが以下のコマンドになります。

git revert -m <1や2等、戻すべきコミットを指定する数値> <マージコミット>

マージコミットと戻すべきコミットの差分を取得する必要があります

詳しくはこちら↓

https://www.seeds-std.co.jp/blog/creators/2019-02-19-211149/ https://hiro8blog.com/how-to-revert-merge-commit/

~複数コミットをまとめてrevertコマンド

指定したコミットしかrevertしません。

複数でのrevertは以下のコマンド

git revert {始点のコミットハッシュ}...{終点のコミットハッシュ} or git revert {始点のHEAD}...{終点のHEAD}

■最後に

git revertは使用頻度が低いものの、使う時は緊急の時が多いと思いますのでしっかりと勉強しておくのがいいと思いました。来たる緊急事態にむけてgitの勉強時間を確保したいと思います。