git revert:履歴を残しながら変更を取り消す
git revert は特定のコミットの変更内容を「逆操作」して、新しいコミットとしてその結果を記録するコマンドです。元の履歴はそのまま残り、取り消し操作自体も履歴に明確に記録されるため、チーム開発などで安全にバージョンの問題を修正したい場合に適しています。
たとえば、以下の状態で commit C の変更に不具合があるとします:
A --- B --- C (HEAD)
git revert C を実行すると、Cの変更を打ち消す内容で新しいコミットDが作成されます:
A --- B --- C --- D (HEAD)
Dの内容はBの時点と同じになりますが、履歴上はすべてのコミットが残ります。
複数のコミットを戻す場合
過去の複数のコミットを順に取り消すには、古い方からではなく最新のものから一つずつrevertしていく必要があります。たとえば、以下のような履歴で最後の3つのコミットを取り消したい場合:
fbc9245 --- 2d73d74 --- 0343dc3 --- 020cf2e (HEAD)
次のように順番に実行します:
git revert 020cf2e
git revert 0343dc3
git revert 2d73d74
この方法なら、マージコンフリクトを最小限に抑えつつ、意図した状態へ戻せます。
git restore:作業中の変更を破棄または復元
git restore は、ワーキングツリーまたはステージングエリアの状態を元に戻すために使用されます。主にローカルでの編集ミスを修正する際に活用します。
ステージング済みファイルをワーキングツリーに戻す
ファイルをgit addしてステージングエリアに登録してしまったが、再度編集したい場合:
git restore --staged bar.txt
これにより、bar.txtはステージングから外れ、変更はワーキングツリーに残ります。
ワーキングツリーの変更を完全に破棄
編集中の変更をすべて元の状態に戻したい場合は:
git restore greeting.txt
このコマンドで、greeting.txtは直前のコミットの状態に完全に復元され、未保存の変更は失われます。
削除されたファイルを復元
誤って削除してしまったがまだコミットしていないファイルも、同じコマンドで復元可能です:
git restore deleted-file.txt
最新のコミットから該当ファイルの内容を再現します。
git reset:HEADの位置を変更して履歴を調整
git reset は現在のブランチのHEADポインタを移動させ、それに応じてステージングエリアやワーキングツリーの状態を調整します。オプションによって影響範囲が異なります。
--soft:コミットだけを戻し、変更はすべてステージングに保持
コミット履歴を1つ戻すが、そのコミットで行った変更はすべてステージングエリアに残します。
git reset --soft HEAD~1
たとえば、以下のような状態で実行:
- ワーク:一部編集中
- ステージ:1.txt(追加済)
- コミット:10.txt を含む new-commit
実行後、HEADは一つ前のコミットを指しますが、10.txt の追加や1.txtの変更はすべてステージング済みのままになります。
--mixed(デフォルト):変更をワーキングツリーに戻す
ステージングエリアの内容をすべてワーキングツリーに降ろし、追加されたファイルはuntracked状態になります。
git reset --mixed HEAD~1
前述の例で実行すると:
- 1.txt はステージングから外れて「変更あり」となる
- 9.txt や 10.txt などの新規ファイルは untracked(追跡対象外)になる
つまり、「コミット前の状態」に近づけます。
--hard:完全に前の状態へ戻す(危険)
ワーキングツリーとステージングエリアのすべての変更を破棄し、指定のコミット状態に強制的に戻します。
git reset --hard HEAD~1
注意点:
- 未コミットの変更はすべて失われる
- 新しく作成したファイルも削除される
- 削除したファイルは復活する(そのコミットで削除されていれば)
この操作は取り消しが効かないため、信頼できるバックアップがある場合や、確実に不要な変更を捨てるときのみ使用してください。