【Git】直前のコミットを取り消す方法をわかりやすく解説

Web開発

はじめに

Gitで作業をしていると、コミットしたあとに「やっぱりこの変更は取り消したい」「不要なファイルをコミットしてしまった」といった問題が起きることがありますね。
特に直前のコミットを取り消したい場合、いくつかの方法を知っていると落ち着いて対処できるでしょう。

本記事では、Gitの基本にあまり慣れていない方でもわかりやすいように、直前のコミットを取り消す方法を丁寧に整理します。
実際にプロジェクトで使われる流れと結びつけることで、作業のイメージを掴んでいただければと思います。

この記事を読むとわかること

  • Gitで直前のコミットを取り消す主な手順
  • revert コマンドと reset コマンドの違い
  • コミット取り消しの実務的な注意点
  • チームで作業するときのポイント

上記を理解することで、誤ってコミットしてしまった変更を手軽に取り消せるようになります。
それによって安全に開発を進められるでしょう。

直前のコミットを取り消すシーンとは

Git初心者の方は、そもそも「コミットを取り消す」という行為がどんなシーンで必要になるのかピンとこないかもしれません。
そこでまずは、実務で遭遇しがちな例を挙げてみましょう。

うっかりファイルを追加してしまった

変更内容に含めるべきでないファイルをコミットしてしまう場合があります。
たとえば、個人的に作成したテスト用のファイルや、特定の設定ファイルなどが該当することがあるでしょう。
手元だけならまだしも、共同開発中のリポジトリに誤ってプッシュしてしまうと問題になります。

バグが含まれていた

コードレビュー中やテスト時に「今コミットしたコードにバグがある」と気づくこともあります。
すぐに修正可能ならいいですが、思っていたより大きな問題だったときには、一旦そのコミットを取り消したほうが混乱が少ないこともあるでしょう。

コミットコメントや内容を変更したい

コミットコメントを間違えてしまうケースもよくあります。
また、あとから「あの変更はやめておこう」と思って再度修正が必要になることもあるはずです。
いずれにしても、必要に応じてコミットを取り消し、修正して再度コミットするほうがスムーズに進むことがあります。

Gitで直前のコミットを取り消すための主要コマンド

ここでは直前のコミット取り消しによく使われる代表的な2つの方法について整理します。
大まかに分けると、git revertgit reset を使う方法が挙げられます。

revert

git revert は「取り消す用の新しいコミットを作成する」仕組みを持ちます。
特に複数の人が同じリポジトリで開発している場合、履歴が上書きされないため安全に取り消すことができます。
現在あるコミット履歴を残しつつ、修正コミットを追加するイメージです。

reset

git reset は過去のコミット時点にブランチを戻す操作です。
「作業ツリー」と「インデックス」、そして「コミット(HEAD)」がどのように変更されるかは、resetに指定するオプションによって異なります。
共同開発では慎重に使わないと履歴が書き換わる恐れがあるので、チームで取り扱う場合は使いどころに注意が必要です。

revertを使う方法

まずは revert を使った直前コミット取り消しの具体的な例を紹介します。
revert では、対象となるコミットの内容を逆向きに適用した新しいコミットが作成されます。

基本的なコマンド例

直前のコミットを revert する方法は次のとおりです。

git revert HEAD

このコマンドを実行すると、Gitは自動的に直前のコミットを反転させるコミットを作ってくれます。
実行後にエディタが起動し、コミットメッセージを入力する画面が出てくることがあります。
その場合、適宜コメントを書いて保存すると、取り消し用のコミットが生成されます。

実務での使い方

実務では、すでに他の人がリモートリポジトリをクローンして開発を進めているケースがほとんどです。
そのため、履歴を改変せずにコミットを打ち消したい時に revert を使うとよいでしょう。
取り消し操作が記録されるので、あとから原因を調べる際も履歴を追跡しやすくなります。

チーム開発では、履歴の整合性や理解しやすさが重要になることがあります。
履歴を残したまま取り消したい場合は、revertの利用が便利です。

revertの後に注意する点

revert を使ってコミットを取り消したあとは、ローカルだけで作業が終わっていないかを確認しておきましょう。
たとえば、新たなコミットが発生しているので、リモートリポジトリへプッシュするなら git push が必要です。
他の開発メンバーと連携している場合は、どのコミットを取り消したかを一言共有しておくと混乱が起きにくいです。

resetを使う方法

次に git reset で直前のコミットを取り消す流れを整理します。
resetは便利ですが、作業ツリーやコミット履歴を巻き戻す性質があり、共同開発では使いどころが難しい場面もあるでしょう。

基本的なコマンド例

直前のコミットを取り消すには、以下のようなコマンドを使うことが多いです。

# 直前のコミットを取り消して、ステージングに戻す
git reset --soft HEAD~1

# 直前のコミットを取り消して、変更点は作業ディレクトリに残す
git reset --mixed HEAD~1

# 直前のコミットを取り消して、変更点も全て破棄する
git reset --hard HEAD~1

HEAD~1 は「一つ前のコミット」を表します。
オプションによって挙動が異なるので簡単にまとめると、--soft はコミットを取り消しつつ変更点はステージングへ残し、--mixed はステージングからも外して作業ディレクトリに戻す、--hard はすべての変更を破棄します。

実務での使い方

もしまだローカルでしかコミットしていないのであれば、--soft--mixed を使って前の状態に戻し、修正して改めてコミットするのがよくある流れです。
ただし、--hard は文字どおりすべての変更が消えてしまうため、本当に変更を失っても問題ないのか注意してから実行しましょう。

一方で、すでにリモートリポジトリへプッシュしてしまったコミットを reset で巻き戻すと、履歴が変わってしまいます。
これはチーム開発で思わぬ衝突の原因となるため、原則として避けたほうがいいケースがほとんどです。

resetの後に注意する点

git reset を使った後は、戻した分だけ履歴が書き換わっています。
その状態でプッシュすると、リモートリポジトリの履歴とも整合が取れなくなる可能性があるので、状況に応じて force push などをしなければいけないことがあるでしょう。
しかし force push は運用を誤ると大きなトラブルにつながりがちなので、取り扱いには慎重になる必要があります。

revert と reset の違いと選択基準

まとめると、次のような違いがあります。
それぞれのメリット・デメリットを理解すると、どちらを使うかが判断しやすくなるでしょう。

revert の特徴

  • 履歴を上書きせず、打ち消し用コミットを作成する
  • リモートリポジトリにプッシュ後の変更でも安全に取り消しができる
  • 取り消し履歴が増えてしまう

reset の特徴

  • 指定のコミットまで履歴を巻き戻す
  • コミット履歴が書き換わるため、チーム開発では注意が必要
  • ローカルだけでの作業なら、簡単に修正が可能

開発現場でも「安全に進めたい場合は revert」「ローカルだけでまだ変更を送っていない場合は reset」といった使い方をされることが多いです。
プッシュ済みのコミットを取り消すときは、誤って履歴を書き換えてしまわないように特に注意しましょう。

直前のコミットを修正するだけの場合

コミット丸ごと取り消すというより、「コミットメッセージだけ修正したい」「ファイルを一つ追加し忘れたので一括修正したい」といったケースもありますよね。
その場合は git commit --amend というコマンドも利用できます。

# 直前のコミットに修正を加える場合
git commit --amend

これは、最後のコミットを再編集して一つにまとめる機能です。
ただし、この操作も履歴が書き換わるため、すでにリモートへプッシュした直後のコミットを修正すると衝突を引き起こす恐れがあります。
チーム内で誰もそのコミットを基点に作業していないなど、状況が許す場合に限定するのが無難でしょう。

共同開発で気をつけるポイント

チーム開発でコミットを取り消すときに意識しておくべき点を確認しておきましょう。

誰かがすでにプルしていないか

自分がコミットした変更を他のメンバーがすでにプルしている場合があります。
その状態で reset して履歴を巻き戻すと、別のメンバーとの間でコンフリクトが起きたり、変更が意図せず消えたりするかもしれません。
取り消しの前に、ブランチの状況を確認する癖をつけておくと安心です。

コミットIDを間違えない

過去のコミットを指定するとき、コミットIDをミスすると別の重要な変更を打ち消してしまう可能性があります。
特に revert コマンドで対象コミットIDを明示する場合や、reset --hard を使う場合は要注意です。
誤って意図しないコミットを取り消さないように、コミットIDは正しく確認しましょう。

チーム内ルールに合わせる

チームによっては、Gitの運用ルール(フロー)が決まっているケースもあります。
「プッシュ後のコミットは revert だけを使う」「ブランチを切っている間は自由に reset してOK」など、方針があるかもしれません。
迷ったらチームで認識を合わせると良いでしょう。

プロジェクトやチームによっては、revertやresetの使い方にルールが設定されていることがあります。
特にリモートリポジトリの履歴が破壊されるリスクを避けるため、チームで相談してから操作するのがおすすめです。

いざというときの対処法

作業中に慌ててしまうと、コミット取り消しにかえって失敗してしまうことがあるかもしれません。
「思ったのと違う状態になった」「大事な変更が消えてしまった」と感じると不安になりますよね。

もし何かトラブルが起きたら、下記のような流れで落ち着いて対処してください。

  1. 現状のステータスを確認する: git statusgit log などを使い、今どういう状態なのかを把握する
  2. コミットログを確認する: どの時点で変更が加わったのか調べる
  3. リモートリポジトリに残っているかチェック: ローカルで消えたと思っても、リモートには履歴が残っていることがある
  4. 取り消したいコミットIDや操作を再度確認する: revertやresetを使う前に、対象コミットが正しいか検証する

Gitは履歴を扱うツールですので、一歩ずつ状況を振り返れば意外と取り返せる場合もあります。
落ち着いて確認作業を行うことが大事でしょう。

まとめ

ここまで、直前のコミットを取り消す方法として revertreset を中心に紹介しました。
実務で使用する上では、プッシュ後か否か、チームで共有済みか否かなどの状況を踏まえて、最適な方法を選ぶのがポイントです。

  • プッシュ後のコミットを取り消すなら revert がおすすめ
  • プッシュ前なら reset を使って簡単に巻き戻す方法もある
  • 取り消しだけでなく、コミット内容の一部修正は amend も便利
  • チーム開発では誰かがそのコミットを参照していないか注意する

コミットを取り消す操作は、作業の流れや共同開発のルールと結びついて理解するとスムーズです。
今回紹介した方法を覚えておくことで、もしものときにも焦らず対処できるようになるでしょう。

Gitをマスターしよう

この記事で学んだGitの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。