🎁

GitHub での変更を戻す方法(add・commit・push)

2025/02/11に公開

GitHub を使っていると、変更をステージングした後やコミットした後、さらにはリモートにプッシュした後に「間違えた😱 」と気づくこと、ありますよね?
そんなときに慌てずに済むように、各段階での変更を戻す方法をまとめました。

🛀 Gitがリモートに上がるまでの流れ

Gitでファイルをリモートにアップロードするまでには、以下の 4つのステップ を経由します。

🔄 Gitのデータの流れ

  1. 作業ディレクトリ 📝
  • 実際に作業しているファイルの最新の状態を表します。
  • 変更を加えたファイルは、まだ Git には記録されていません。
  1. ステージング(インデックス) 📌
  • 次のコミット (変更履歴の記録) に含めるファイルを一時的に置いておく場所 です。
  • git add でファイルをステージングエリアに追加すると、「この変更をリポジトリに反映する準備をする」とGitに指示します。
  1. ローカルリポジトリ 📂
  • 自分の PC 内にある、ファイルの変更履歴を記録する場所です。
  • git commit で変更をローカルリポジトリに保存し、「リモートリポジトリに送る準備をする」とGitに指示します。
  1. リモートリポジトリ 🌍
  • ネットワーク上にある、複数の人でファイルの変更履歴を共有する場所です。
  • git push でローカルリポジトリの変更をリモートリポジトリに送信すると、他の人と変更を共有できます。

📌 各ステップの操作コマンド

ステップ コマンド 説明
作業ディレクトリ → ステージング git add <ファイル名> 作業中のファイルを次のコミット対象に追加
ステージング → ローカルリポジトリ git commit -m "コミットメッセージ" ステージングされた変更をローカルに記録
ローカルリポジトリ → リモートリポジトリ git push origin <ブランチ名> ローカルの変更をリモートにアップロード

Gitの流れを理解すれば、「どの段階でミスしたか?」がわかり、落ち着いて変更を戻すことができます。

💻 git reset コマンド

Git の reset コマンドは、変更を元に戻すための便利なツールで 主に addcommit の後 に使われます🔄✨

git reset には、3つの --soft--mixed--hard というオプションがあります。

オプション 説明
--soft コミットを取り消すが、ステージングと作業ディレクトリの変更はそのまま
--mixed (デフォルト) コミットとステージングを取り消すが、作業ディレクトリの変更はそのまま
--hard すべての変更を取り消し、元に戻せない

1️⃣ git add したけど戻したい

タイミング:まだ commit していない場合
目的git add でステージングした変更を取り消す
コマンド

git reset <ファイル名>

指定したファイルのステージングを解除します(作業ディレクトリの変更はそのまま)

🔄 すべてのステージングを解除する場合

git reset

--mixed オプションがデフォルトのため、 git reset --mixed HEAD と同じ動作になります。

2️⃣ git commit したけど戻したい

タイミング:まだ push していない場合
目的:コミットを取り消す
コマンド

🔄 1. コミットのみ解除する場合(変更はステージングに残す)

git reset --soft HEAD~1

🔄 2. コミットもステージングも解除する場合(変更は作業ディレクトリに残す)

git reset --mixed HEAD~1

🔄 3. コミットも変更も完全に消したい場合

git reset --hard HEAD~1

🏷️ HEAD とは?

Git における HEAD は、現在チェックアウトしている 最新のコミット を指すポインタです。
HEAD~1 を指定すると、「現在のコミットの1つ前」を指し、直前のコミットを取り消すことができます。

具体例

🚀 具体例

例えば、以下のような状況を考えてみましょう👀

  1. ファイル sample.txt を変更し、git add でインデックスに追加した。
  2. git commit -m "commit 1" でコミットした。
  3. ファイル sample.txt を再度変更し、git add でインデックスに追加した。
  4. git commit -m "commit 2" でコミットした。

この状態で git reset --soft HEAD~1 を実行すると、

  • HEAD は "commit 1" を指すようになります。
  • インデックスには、"commit 2" で行った変更が残っています。
  • 作業ディレクトリには、"commit 2" で行った変更が残っています。

この後、git commit -m "commit 2'" などとして再度コミットすることで、変更をやり直すことができます。

👀 メモ

  • --soft オプションは、変更をインデックスと作業ディレクトリに残すため、誤って変更を消してしまう心配がありません。
  • ただし、変更内容をコミットし直す必要があります。

3️⃣ git push したけど戻したい

タイミング:すでにリモートに push した後
目的:間違えて push したコミットを取り消す
手順

git revert HEAD # HEAD -> コミットID でも OK!
git push

revert は push 済みのコミットを残しつつ、新しいコミットを作成して変更を取り消すので、履歴を壊さずに安全です。

revert にはデフォルトで -edit オプションがついています(git revert HEAD -edit)。エディターが開き、revert をコミットするためのコミットメッセージを編集するよう求められます。
コミットメッセージを編集しない(エディタを開かない)場合は、--no-edit オプションをつけます。

git revert 後は git push も忘れず行い、リモートリポジトリに反映させましょう🎉

🎯 まとめ

操作のタイミング 使用する git reset 影響
git add の後 git reset または git reset HEAD <ファイル> ステージングを解除
git commit の後 git reset --soft HEAD~1 コミットを取り消し、ステージングは維持
git commit の後 git reset --mixed HEAD~1 コミットとステージングを取り消し、変更は作業ディレクトリに残る
git commit の後 git reset --hard HEAD~1 すべて取り消し(要注意!)
git push の後 git revert HEAD && git push 履歴を保持しながら変更を取り消す

困ったときは git status で現在の状態を確認し、git log --oneline --graph などで履歴を可視化すると、状況を把握しやすくなります🎉

以上、どなたかの参考になれば幸いです。
えみり〜でした|ωΦ)ฅ

✨ 参考

Discussion