0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Gitのコミット取り消し完全ガイド - reset の使い分け

Posted at

はじめに

Gitを使っていて「あ、間違えてコミットしちゃった!」という経験はありませんか?
この記事では、git resetを使ったコミット取り消しの方法を、--soft--mixed--hardの3つのオプションの違いを含めて解説します。

基本的な流れ

コミットを取り消す際の基本的な流れは以下の通りです。

1. コミット履歴を確認

まず、どのコミットを取り消すのか確認するため、履歴を見てみましょう。

git log --oneline -20

このコマンドで最新20件のコミット履歴が表示されます。

実行例:

a1b2c3d (HEAD -> main) 最新のコミット
e4f5g6h その前のコミット
i7j8k9l さらに前のコミット
...

2. コミットを取り消す

git resetコマンドでコミットを取り消します。ここでは3つのオプションから選択します。

3. 状態を確認

取り消し後、現在の状態を確認します。

git status

reset の3つのオプション

git resetには3つのモードがあり、それぞれ取り消し後の状態が異なります。

パターン1: --soft (一番安全)

特徴: コミットだけを取り消し、変更内容はステージング領域に残る

git reset --soft HEAD~1

どんな時に使う?

  • コミットメッセージを書き直したい時
  • 複数のコミットを1つにまとめたい時
  • コミットはやり直したいが、変更内容は保持したい時

実行後の状態:

git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   file1.txt
        modified:   file2.txt

変更内容がステージング済み(git add済み)の状態になっているので、すぐに再コミット可能です。

パターン2: --mixed (デフォルト)

特徴: コミットとステージングを取り消し、変更内容はワーキングディレクトリに残る

git reset --mixed HEAD~1
# または
git reset HEAD~1  # --mixedはデフォルトなので省略可能

どんな時に使う?

  • コミット前の状態に戻って、ファイルを選び直したい時
  • 一部のファイルだけ再度ステージングしたい時
  • git addからやり直したい時

実行後の状態:

git status
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   file1.txt
        modified:   file2.txt

変更内容は残っていますが、ステージングが解除された状態です。必要に応じてgit addし直せます。

パターン3: --hard (注意が必要)

特徴: コミット、ステージング、変更内容をすべて取り消す

git reset --hard HEAD~1

⚠️ 警告: このコマンドは変更内容を完全に削除します。元に戻せないので慎重に使用してください。

どんな時に使う?

  • 変更内容が完全に不要な時
  • 前のコミット状態に完全に戻りたい時
  • 実験的な変更を全部破棄したい時

実行後の状態:

git status
On branch main
nothing to commit, working tree clean

すべての変更が消え、クリーンな状態になります。

3つのオプションの比較表

オプション コミット ステージング 変更内容 用途
--soft 取り消す 保持 保持 コミットメッセージの修正
--mixed 取り消す 取り消す 保持 ステージングからやり直し
--hard 取り消す 取り消す 削除 完全にやり直し(注意)

HEAD~1 の意味

HEAD~1は「現在のコミットから1つ前」を意味します。

  • HEAD~1 : 1つ前のコミット
  • HEAD~2 : 2つ前のコミット
  • HEAD~3 : 3つ前のコミット

複数のコミットをまとめて取り消したい場合は、数字を変更します。

実践例:コミットメッセージを修正する

# 1. 履歴確認
git log --oneline -20

# 2. 直前のコミットを取り消す(変更は保持)
git reset --soft HEAD~1

# 3. 状態確認
git status

# 4. 正しいメッセージで再コミット
git commit -m "正しいコミットメッセージ"

よくある間違いと対処法

間違えて --hard してしまった場合

すぐであればgit reflogで復旧できる可能性があります。

git reflog
git reset --hard <元のコミットのハッシュ>

リモートにpush済みのコミットを取り消したい場合

すでにリモートにpushしたコミットは、チームメンバーに影響があるため慎重に対応が必要です。
対処法は2つあります。

方法1: revert を使う(推奨)

特徴: 履歴を残したまま、変更内容を打ち消す新しいコミットを作成する

# 1. 履歴確認
git log --oneline

# 2. 取り消したいコミットをrevert
git revert a1b2c3d --no-edit

# 3. 状態確認
git status

# 4. プッシュ
git push origin feature/ブランチ名

メリット:

  • 履歴が残るので安全
  • チームメンバーに影響が少ない
  • 強制pushが不要

いつ使う?

  • チームで開発している時(基本的にこちらを推奨)
  • main/masterブランチなど、保護されたブランチの場合

方法2: reset + 強制push(慎重に)

特徴: コミット履歴ごと削除して強制的にリモートを書き換える

# 1. 履歴確認
git log --oneline

# 2. ローカルでコミットを削除
git reset --hard HEAD~1

# 3. 状態確認
git status

# 4. 強制push
git push origin feature/ブランチ名 --force

⚠️ 注意点:

  • 他の人がそのブランチを使っている場合、コンフリクトが発生する
  • 履歴が書き換わるため、チームメンバーの混乱を招く可能性がある
  • 実行前に必ずチームに確認する

いつ使う?

  • 自分専用のfeatureブランチで、誰も使っていない時
  • まだ誰もpullしていない直後の場合
  • どうしても履歴をきれいにしたい時(レビュー前など)

2つの方法の比較

項目 revert reset + force push
履歴 残る 消える
安全性 高い 低い
チーム開発 ◎ 推奨 △ 注意が必要
使用場面 本番・共有ブランチ 個人ブランチ

まとめ

ローカルのコミット取り消し

  • 迷ったら--softを使う(一番安全)
  • ステージングからやり直したいなら--mixed
  • 完全に削除したい場合のみ--hard(慎重に)
  • まずはgit log --onelineで状況確認
  • 実行後はgit statusで状態確認

リモートにpush済みの場合

  • 基本的にはrevertを使う(履歴を残して安全に取り消し)
  • 個人ブランチでどうしても履歴を消したい時だけreset --hard + --force

Gitのコミット取り消しは慣れれば便利な機能です。最初は--softから始めて、徐々に使い分けられるようになりましょう!

参考リンク


この記事が役に立ったら、いいね♡をお願いします!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?