Gitにおけるrestore、reset、revertの違いと使い方

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

注意点:

  • 未コミットの変更はすべて失われる
  • 新しく作成したファイルも削除される
  • 削除したファイルは復活する(そのコミットで削除されていれば)

この操作は取り消しが効かないため、信頼できるバックアップがある場合や、確実に不要な変更を捨てるときのみ使用してください。

タグ: Git version control revert reset Restore

8月3日 03:04 投稿