blog 開発

【Git】間違えてマージしてしまったら「revert」で打ち消そう!

「GitHubでプルリクエストをしてレビューが来る前に、間違えて承認してマージしてしまった!」
そんなあなたのために今回は、Gitでコミットしてしまった処理を打ち消す方法を紹介します。

想定読者

  • Gitを使い始めた駆け出しエンジニア
  • 同じようなミスしてしまったエンジニア

そんな方に見ていただければと思います。

GitHubとソースツリーを使ってプルリクエストまでの手順は、下記記事を読んでみてください!

処理を打ち消すコマンド「git revert」

git revert」とは、特定のコミットの処理を、打ち消すコミットを作成する命令です。突然不要になってしまったコミット(冒頭のような事例)が発生したときに、コミット自体を削除するために作成するものです。

仕組みは、下記画像をご確認ください。
間違えてコミットしてしまった処理を削除した新しいコミットを作成するのがgit revertの役割です。ここで注意したいのは、git revertは間違えたコミットの1つ前のコミットに戻るわけではないということ。なので、1つ目のコミットとrevertを使った後のコミットは、別物という認識は忘れずにいてください。

※◯が各コミット

git revertの使い方

git revertの使い方は、コマンドから行う方法と、GitHub上で行う方法があります。
2パターン紹介します。

revertは色んな所でコンフリクトを起こしやすいので、行う場合は慎重に行なってください。

コマンドで行う方法

git revert [打ち消したいコミットID]

これでコミットを削除することができます。
ちなみにコミットIDの調べかたは、下記を行なってください。

$ git log

実行結果は下記のような感じ

commit 844d80b612e9e91a7b9a57cec29fcfa33bdca36b
Merge: ××××××× ×××××××
Author: ×××× <×××××××××××@gmail.com>
Date:   Wed Jun 12 23:19:59 2024 +0900

黄色になっているところがIDなので先ほどのコマンドに入れて実行をしましょう。

GitHubで行う方法

冒頭のシチュエーションですと、マージリクエストが承認されてマージコミットされるとこのような画面が表示されます。画面に赤枠で囲っているところが「Revert」なので、こちらを押せばgit rvertになります。

先ほど画像で仕組みを紹介した通り、1つ前のコミットに戻るわけでなく、マージ前の状態のブランチをマージ後のブランチに再度マージするような形になるので、上記の「Revert」を押すとGithubでは「revert-プルリクエスト番号-元のブランチ名」という名前のRevert専用のブランチが作成されます。

これを通常通り「Create pull request」を押し下記画像のように「Merge pull request」を行なってください。

ここから僕の場合は、リクエストの状態でレビュー待ちにしたいので、再度プルリクエストを「feature」から「develop」に行います。ところが、「feature」から「develop」でプルリクエストを作ろうとしても下記画像のように変更がありませんと表示されます。

これは、一度「feature」ブランチ自体は、一度マージされてしまっているので、元々の変更点は、一度取り込まれた形になっているので、変更が認識されてない状態です。

なので、次は先ほど行った「Revert」を「Revert」します。

プルリクエストから「Closed」を押し、Revertを選択します。
ここからは先ほどと同じようにrevertを行いプルリクエストからマージまで行います。

マージまで行ったら完了です!

単語帳

コミット

変更を記録する操作のこと

ブランチ

開発の本流から分岐し、本流の開発を邪魔することなく作業を続ける機能

今回のGithubで言うとmasterブランチからdevelopブランチやfeatureブランチなどに枝分かれしている

プルリクエスト

自分の変更したコードをリポジトリに取り込んでもらえるよう依頼すること

マージ

複数あるファイルやプログラムなどを決められたルールに従って一つに統合すること

コンフリクト

Gitで管理する複数のデータに、重複や競合が発生している状態のこと

  • この記事を書いた人

鈴木陽介

24歳のサラリーマン

営業・SEO・デザインの仕事をしている

Javaを身につけエンジニアになる予定

もうすぐ書籍を出版します。

-blog, 開発