resetとrevert
resetとrevert
Section titled “resetとrevert”コミットを取り消すresetとrevertについて詳しく解説します。
なぜresetとrevertを理解する必要があるのか
Section titled “なぜresetとrevertを理解する必要があるのか”コミット取り消しなしの問題
Section titled “コミット取り消しなしの問題”問題のある状況:
開発者: 「間違ったコミットをしてしまった...どうしよう?」開発者: 「このコミット、取り消したいけど、履歴を壊したくない...」
// 問題点:// - 間違ったコミットの取り消し方法がわからない// - 履歴を壊してしまうリスク// - チームに影響を与える可能性影響:
- 間違ったコミットの修正が困難
- 履歴の破壊
- チームへの影響
- データの損失
resetとrevertによる解決
Section titled “resetとrevertによる解決”改善された状況:
適切なコミット取り消し:- reset: ローカルでの履歴の書き換え- revert: 新しいコミットで取り消し- 履歴を保持しながら修正メリット:
- 間違ったコミットの修正が容易
- 履歴の保護
- チームへの影響を最小化
- データの保護
reset(リセット)
Section titled “reset(リセット)”resetとは
Section titled “resetとは”定義:
resetは、HEADの位置を変更し、作業ディレクトリやステージングエリアの状態を変更するコマンドです。
基本的な使い方:
# HEADを指定のコミットに移動git reset <コミットハッシュ>
# 3つのモード:# --soft: HEADのみ移動(ステージングエリアと作業ディレクトリは変更しない)# --mixed: HEADとステージングエリアを変更(デフォルト)# --hard: HEAD、ステージングエリア、作業ディレクトリをすべて変更resetの3つのモード
Section titled “resetの3つのモード”1. —soft(ソフトリセット):
# HEADのみ移動git reset --soft HEAD~1
# 例:# 前: HEAD → A (ステージング済み)# 後: HEAD → B (ステージング済み、変更は保持)2. —mixed(ミックスリセット、デフォルト):
# HEADとステージングエリアを変更git reset HEAD~1# またはgit reset --mixed HEAD~1
# 例:# 前: HEAD → A (ステージング済み)# 後: HEAD → B (ステージングされていない、変更は保持)3. —hard(ハードリセット):
# HEAD、ステージングエリア、作業ディレクトリをすべて変更git reset --hard HEAD~1
# 例:# 前: HEAD → A (変更あり)# 後: HEAD → B (すべての変更が失われる)
# ⚠️ 注意: 作業ディレクトリの変更が失われますresetの実践例
Section titled “resetの実践例”直前のコミットを取り消し:
# 1. コミット履歴を確認git log --oneline# abc1234 最新のコミット# def5678 前のコミット
# 2. 直前のコミットを取り消し(変更は保持)git reset --soft HEAD~1
# 3. 変更を確認git status# 変更はステージング済みの状態で保持される
# 4. 必要に応じて再コミットgit commit -m "修正したコミットメッセージ"ステージングを取り消し:
# 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特定のコミットまで戻る:
# 1. コミット履歴を確認git log --oneline# abc1234 最新のコミット# def5678 2番目のコミット# ghi9012 3番目のコミット
# 2. 3番目のコミットまで戻る(変更は保持)git reset --soft ghi9012
# 3. すべての変更を破棄して戻るgit reset --hard ghi9012revert(リバート)
Section titled “revert(リバート)”revertとは
Section titled “revertとは”定義:
revertは、指定したコミットの変更を取り消す新しいコミットを作成するコマンドです。履歴を保持しながら変更を取り消します。
基本的な使い方:
# 特定のコミットを取り消すgit revert <コミットハッシュ>
# 複数のコミットを取り消すgit revert <コミット1> <コミット2>
# コミットメッセージを編集git revert -e <コミットハッシュ># またはgit revert --edit <コミットハッシュ>revertの実践例
Section titled “revertの実践例”基本的な使用:
# 1. コミット履歴を確認git log --oneline# abc1234 最新のコミット# def5678 取り消したいコミット# ghi9012 前のコミット
# 2. 特定のコミットを取り消すgit revert def5678
# 3. 新しいコミットが作成されるgit log --oneline# xyz9999 Revert "取り消したいコミット"# abc1234 最新のコミット# def5678 取り消したいコミット# ghi9012 前のコミットコンフリクトの解決:
# 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複数のコミットを取り消し:
# 複数のコミットを取り消すgit revert def5678 abc1234
# 範囲でコミットを取り消すgit revert --no-commit HEAD~3..HEADgit commit -m "複数のコミットを取り消し"reset vs revert
Section titled “reset vs revert”| 項目 | reset | revert |
|---|---|---|
| 履歴 | 履歴を書き換える | 新しいコミットを作成 |
| 安全性 | 履歴が変更される | 履歴が保持される |
| 使用場面 | ローカルでの取り消し | 共有ブランチでの取り消し |
| リスク | 履歴の破壊 | コンフリクトの可能性 |
resetを使うべき場合:
# 1. ローカルでのコミット取り消しgit reset --soft HEAD~1
# 2. まだプッシュしていないコミットgit reset HEAD~1
# 3. 作業ディレクトリをクリーンにしたい場合git reset --hard HEADrevertを使うべき場合:
# 1. すでにプッシュしたコミットgit revert abc1234
# 2. 共有ブランチでの取り消しgit revert abc1234
# 3. 履歴を保持したい場合git revert abc1234実践的なワークフロー
Section titled “実践的なワークフロー”1. 間違ったコミットの修正(ローカル)
Section titled “1. 間違ったコミットの修正(ローカル)”# 1. 間違ったコミットをしたgit commit -m "間違ったコミット"
# 2. コミットを取り消し(変更は保持)git reset --soft HEAD~1
# 3. 変更を修正
# 4. 正しいコミットを作成git add .git commit -m "正しいコミット"2. 間違ったコミットの修正(共有ブランチ)
Section titled “2. 間違ったコミットの修正(共有ブランチ)”# 1. 間違ったコミットをプッシュしてしまったgit push origin main
# 2. revertで取り消しgit revert abc1234
# 3. プッシュgit push origin main3. 作業ディレクトリのクリーンアップ
Section titled “3. 作業ディレクトリのクリーンアップ”# すべての変更を破棄git reset --hard HEAD
# 未追跡ファイルも削除git clean -fdresetとrevertのポイント:
- reset: HEADの位置を変更、履歴を書き換える、ローカルでの使用
- resetの3つのモード: —soft、—mixed、—hard
- revert: 新しいコミットで取り消し、履歴を保持、共有ブランチでの使用
- 使い分け: resetはローカル、revertは共有ブランチ
- 実践的なワークフロー: 間違ったコミットの修正、作業ディレクトリのクリーンアップ
適切にresetとrevertを使用することで、安全にコミットを取り消すことができます。