今回は、Gitでコミットを取り消す方法(戻す・削除する方法)について解説します。
Gitを使っていると、こんな場面があるかと思います。
- 間違った内容でコミットしてしまった
- 直前のコミットをなかったことにしたい
- pushした後だけど修正したい
- resetとrevertの違いが分からない
このような場合、Gitではいくつかの方法でコミットを取り消すことができます。
この記事では、以下を分かりやすく解説します。
- コミットを取り消す方法(reset / revert)
- それぞれの違い
- 状況別のおすすめの使い方
結論:基本はこの2つを覚えればOK
まず結論からです。
- 履歴ごと消したい →
git reset - 履歴を残して打ち消したい →
git revert
resetとrevertで履歴を残すか、履歴自体を消すかの違いがあります。
この違いを理解することが最重要です。
git resetとは?
git resetは、コミット履歴を巻き戻すコマンドです。
履歴を消したい場合は、こちらを使いましょう。
よく使うコマンド
git reset --soft HEAD^
直前のコミットを取り消しつつ、変更内容は残します。
HEAD^で直前のコミットを指定し、--softオプションで内容を残しています。
変更内容を残して、ステージングエリアに追加された状態になります。
git reset --mixed HEAD^
コミットとステージングを取り消し、変更は作業ディレクトリに残ります。
変更内容を残して、ステージングエリアから除外された状態になります。
git reset --hard HEAD^
完全に削除します。
コミットも変更内容もすべて消えます。
コミットした内容が本当に不要なとき以外は使うことはないです。
resetの特徴
- コミット履歴が消える
- ローカル作業向き
- push後には基本使わない(履歴が壊れるため)
git revertとは?
git revertは、コミットを打ち消す新しいコミットを作成するコマンドです。
コミットした履歴を残す場合は、こちらを使いましょう。
コミット内容は正しいけど、仕様変更で元に戻したい時など、意図的にコミット履歴を残すときに使うといいです。
基本コマンド
git revert HEAD
直前のコミットを打ち消すコミットが追加されます。
revertの特徴
revertの特徴は下記です。
- 履歴が残る
- チーム開発向き
- push後でも使える
resetとrevertの違い
| 項目 | reset | revert |
|---|---|---|
| 履歴 | 消える | 残る |
| 安全性 | 低い | 高い |
| push後 | NG | OK |
| 用途 | ローカル修正 | 共有後の修正 |
履歴を意図的に残したいならrevertを使うとよいかと思います。
プッシュする前で、コミット履歴を修正したい時にはresetを使いましょう。
resetとrevertの使い分け
状況別のresetとrevertの使い分けについてです。
① pushしていない場合
プッシュしていない時にはgit resetを使うのがオススメです。
git reset --soft HEAD^
理由としては下記になります。
- 履歴をきれいに保てる
- 修正しやすい
② push済みの場合
プッシュ済みの場合にはgit revertを使って、修正コミットを作りましょう。
git revert HEAD
理由としては下記になります。
- 履歴を書き換えない
- チームに影響を与えない
既にプッシュ済みの場合には、他のメンバーが取得している可能性があるので
revertを使う方が安全に更新できます。
③ 完全に消したい(ローカルのみ)
直近のコミットを完全に削除したい場合には、resetで--hardオプションをつけます。
git reset --hard HEAD^
--hardを使うと、変更したファイルは元に戻せないです。
そのため、慎重に実行しましょう。
コミットだけ修正したい場合(おまけ)
最新コミットを「取り消すほどではないけど、直したい」という場合にはcommitコマンドで--amendを使うといいです。
git commit --amend
最新コミットのコミットメッセージの修正をすることができます。
また、コマンド実行前にファイルの追加を行うと、コミットにファイルを含めることができ
コミット忘れのファイルなどを後から追加するときに便利です。
まとめ
今回はコミットを取り消す方法についてまとめました。
Gitでコミットを取り消す方法は主に2つです。
- reset:履歴を消す(ローカル用)
- revert:履歴を残す(安全)
プッシュ前後で使い分けるようにしましょう。
- push前 → reset
- push後 → revert
どちらかというと、resetの方が活躍するシーンも多いので覚えておくと便利です。
(プッシュする前のコミット内容の見直しで、再度修正が必要だった場合など)

コメント