Gitの reset、revert、rebaseの違いまとめ
git reset
過去の状態に戻る(履歴を変更する)
用途
現在のブランチの履歴を「やり直し」たいときに使用。
動作
指定したコミットまで履歴を削除したり、ステージングエリアやワークツリーを変更。
種類
--soft: 履歴だけ戻す(ファイルの内容やステージングはそのまま)。
--mixed: 履歴を戻し、ステージングエリアもリセット(デフォルト動作)。
--hard: 履歴、ステージング、作業ディレクトリすべて戻す(変更が完全に消える)。
# HEADを1つ前のコミットに戻す(ファイル内容はそのまま) git reset --soft HEAD~1
ポイント
履歴を修正する際に使うため、チームで共有された履歴には使わない方が良い。
https://www.r-staffing.co.jp/engineer/entry/20191129_1
git revert
用途
過去のコミットを「打ち消す」新しいコミットを作成します。主に「チームで共有しているリポジトリの変更を元に戻したい」ときに使います。
動作
指定したコミットを取り消す新しいコミットを作成します。
履歴を改変しないため、共有リポジトリでも安全に使用できます。
git rebase
用途. 履歴を編集・整理 するために使います。コミットの順序を変更したり、複数のコミットをまとめたりすることで、履歴を「きれい」にできます。 主に 個人作業やプライベートブランチ で使われることが多いです。
動作
インタラクティブリベース(-i オプション) を使うことで、コミットの削除・編集・結合が可能。 ブランチの基底を別のブランチに移動できる(例: 古いブランチを最新のブランチに追随させる)。
比較
| 機能 | git reset | git revert | git rebase |
|---|---|---|---|
| 主な用途 | 履歴を「やり直す」 | 過去のコミットを「取り消す」 | 履歴を編集・整理 |
| 履歴の改変 | 改変する | 改変しない | 改変する |
| 使用場面 | 個人作業、間違ったコミットの修正 | 共有リポジトリでの安全な取り消し | 履歴を整理して見やすくする、ブランチを最新化 |
| 動作の概要 | 指定したコミットに戻り、履歴や状態をリセット | 指定したコミットを打ち消す新しいコミットを作成 | コミットの順序変更、結合、削除、基底ブランチ変更 |
| 適用範囲 | 履歴、ステージングエリア、ワークツリー | 特定のコミット | 指定の範囲の履歴全体 |
| 安全性 | チーム共有では使用非推奨(履歴が壊れる可能性あり) | 安全(履歴を残すため問題なし) | 共有リポジトリでは非推奨(履歴が改変されるため) |
| 注意点 | 誤った --hard は作業内容が完全に失われるリスクあり |
コミットを「完全削除」ではなく「打ち消し」なので注意 | 操作ミスで履歴が壊れるリスクがある |
| 主なオプション | --soft, --mixed, --hard |
なし | -i(インタラクティブモード) |
| 使用例 | git reset --hard HEAD~1 |
git revert <コミットID> |
git rebase -i <基底ブランチ> |
選び方のポイント
git reset
- 個人作業で「履歴をやり直したい」ときに適している。
- 履歴やファイル状態を戻したいが、共有ブランチでは非推奨。
git revert
- チーム開発で、履歴を保持しながら特定の変更を取り消したい場合に使用。
- 共有リポジトリで安全。
git rebase
- 開発中のブランチを整理したり、最新ブランチに追随させたいときに便利。
- ただし、共有ブランチには使用しない。