Skip to content

resetとrevert

コミットを取り消すresetrevertについて詳しく解説します。

なぜresetとrevertを理解する必要があるのか

Section titled “なぜresetとrevertを理解する必要があるのか”

問題のある状況:

開発者: 「間違ったコミットをしてしまった...どうしよう?」
開発者: 「このコミット、取り消したいけど、履歴を壊したくない...」
// 問題点:
// - 間違ったコミットの取り消し方法がわからない
// - 履歴を壊してしまうリスク
// - チームに影響を与える可能性

影響:

  • 間違ったコミットの修正が困難
  • 履歴の破壊
  • チームへの影響
  • データの損失

改善された状況:

適切なコミット取り消し:
- reset: ローカルでの履歴の書き換え
- revert: 新しいコミットで取り消し
- 履歴を保持しながら修正

メリット:

  • 間違ったコミットの修正が容易
  • 履歴の保護
  • チームへの影響を最小化
  • データの保護

定義: resetは、HEADの位置を変更し、作業ディレクトリやステージングエリアの状態を変更するコマンドです。

基本的な使い方:

Terminal window
# HEADを指定のコミットに移動
git reset <コミットハッシュ>
# 3つのモード:
# --soft: HEADのみ移動(ステージングエリアと作業ディレクトリは変更しない)
# --mixed: HEADとステージングエリアを変更(デフォルト)
# --hard: HEAD、ステージングエリア、作業ディレクトリをすべて変更

1. —soft(ソフトリセット):

Terminal window
# HEADのみ移動
git reset --soft HEAD~1
# 例:
# 前: HEAD → A (ステージング済み)
# 後: HEAD → B (ステージング済み、変更は保持)

2. —mixed(ミックスリセット、デフォルト):

Terminal window
# HEADとステージングエリアを変更
git reset HEAD~1
# または
git reset --mixed HEAD~1
# 例:
# 前: HEAD → A (ステージング済み)
# 後: HEAD → B (ステージングされていない、変更は保持)

3. —hard(ハードリセット):

Terminal window
# HEAD、ステージングエリア、作業ディレクトリをすべて変更
git reset --hard HEAD~1
# 例:
# 前: HEAD → A (変更あり)
# 後: HEAD → B (すべての変更が失われる)
# ⚠️ 注意: 作業ディレクトリの変更が失われます

直前のコミットを取り消し:

Terminal window
# 1. コミット履歴を確認
git log --oneline
# abc1234 最新のコミット
# def5678 前のコミット
# 2. 直前のコミットを取り消し(変更は保持)
git reset --soft HEAD~1
# 3. 変更を確認
git status
# 変更はステージング済みの状態で保持される
# 4. 必要に応じて再コミット
git commit -m "修正したコミットメッセージ"

ステージングを取り消し:

Terminal window
# 1. ステージング済みのファイルを確認
git status
# Changes to be committed:
# modified: file.txt
# 2. ステージングを取り消し(変更は保持)
git reset HEAD file.txt
# または
git reset file.txt
# 3. 変更は作業ディレクトリに残る
git status
# Changes not staged for commit:
# modified: file.txt

特定のコミットまで戻る:

Terminal window
# 1. コミット履歴を確認
git log --oneline
# abc1234 最新のコミット
# def5678 2番目のコミット
# ghi9012 3番目のコミット
# 2. 3番目のコミットまで戻る(変更は保持)
git reset --soft ghi9012
# 3. すべての変更を破棄して戻る
git reset --hard ghi9012

定義: revertは、指定したコミットの変更を取り消す新しいコミットを作成するコマンドです。履歴を保持しながら変更を取り消します。

基本的な使い方:

Terminal window
# 特定のコミットを取り消す
git revert <コミットハッシュ>
# 複数のコミットを取り消す
git revert <コミット1> <コミット2>
# コミットメッセージを編集
git revert -e <コミットハッシュ>
# または
git revert --edit <コミットハッシュ>

基本的な使用:

Terminal window
# 1. コミット履歴を確認
git log --oneline
# abc1234 最新のコミット
# def5678 取り消したいコミット
# ghi9012 前のコミット
# 2. 特定のコミットを取り消す
git revert def5678
# 3. 新しいコミットが作成される
git log --oneline
# xyz9999 Revert "取り消したいコミット"
# abc1234 最新のコミット
# def5678 取り消したいコミット
# ghi9012 前のコミット

コンフリクトの解決:

Terminal window
# revert時にコンフリクトが発生
git revert def5678
# error: could not revert def5678
# hint: after resolving the conflicts, mark the corrected paths
# コンフリクトファイルを確認
git status
# コンフリクトを解決
# ファイルを編集してコンフリクトマーカーを削除
# 解決後、ステージングと続行
git add .
git revert --continue
# revertを中止する場合
git revert --abort

複数のコミットを取り消し:

Terminal window
# 複数のコミットを取り消す
git revert def5678 abc1234
# 範囲でコミットを取り消す
git revert --no-commit HEAD~3..HEAD
git commit -m "複数のコミットを取り消し"
項目resetrevert
履歴履歴を書き換える新しいコミットを作成
安全性履歴が変更される履歴が保持される
使用場面ローカルでの取り消し共有ブランチでの取り消し
リスク履歴の破壊コンフリクトの可能性

resetを使うべき場合:

Terminal window
# 1. ローカルでのコミット取り消し
git reset --soft HEAD~1
# 2. まだプッシュしていないコミット
git reset HEAD~1
# 3. 作業ディレクトリをクリーンにしたい場合
git reset --hard HEAD

revertを使うべき場合:

Terminal window
# 1. すでにプッシュしたコミット
git revert abc1234
# 2. 共有ブランチでの取り消し
git revert abc1234
# 3. 履歴を保持したい場合
git revert abc1234

1. 間違ったコミットの修正(ローカル)

Section titled “1. 間違ったコミットの修正(ローカル)”
Terminal window
# 1. 間違ったコミットをした
git commit -m "間違ったコミット"
# 2. コミットを取り消し(変更は保持)
git reset --soft HEAD~1
# 3. 変更を修正
# 4. 正しいコミットを作成
git add .
git commit -m "正しいコミット"

2. 間違ったコミットの修正(共有ブランチ)

Section titled “2. 間違ったコミットの修正(共有ブランチ)”
Terminal window
# 1. 間違ったコミットをプッシュしてしまった
git push origin main
# 2. revertで取り消し
git revert abc1234
# 3. プッシュ
git push origin main

3. 作業ディレクトリのクリーンアップ

Section titled “3. 作業ディレクトリのクリーンアップ”
Terminal window
# すべての変更を破棄
git reset --hard HEAD
# 未追跡ファイルも削除
git clean -fd

resetとrevertのポイント:

  • reset: HEADの位置を変更、履歴を書き換える、ローカルでの使用
  • resetの3つのモード: —soft、—mixed、—hard
  • revert: 新しいコミットで取り消し、履歴を保持、共有ブランチでの使用
  • 使い分け: resetはローカル、revertは共有ブランチ
  • 実践的なワークフロー: 間違ったコミットの修正、作業ディレクトリのクリーンアップ

適切にresetとrevertを使用することで、安全にコミットを取り消すことができます。