GitHub での変更を戻す方法(add・commit・push)
GitHub を使っていると、変更をステージングした後やコミットした後、さらにはリモートにプッシュした後に「間違えた😱 」と気づくこと、ありますよね?
そんなときに慌てずに済むように、各段階での変更を戻す方法をまとめました。
🛀 Gitがリモートに上がるまでの流れ
Gitでファイルをリモートにアップロードするまでには、以下の 4つのステップ を経由します。
🔄 Gitのデータの流れ
- 作業ディレクトリ 📝
- 実際に作業しているファイルの最新の状態を表します。
- 変更を加えたファイルは、まだ Git には記録されていません。
- ステージング(インデックス) 📌
- 次のコミット (変更履歴の記録) に含めるファイルを一時的に置いておく場所 です。
-
git add
でファイルをステージングエリアに追加すると、「この変更をリポジトリに反映する準備をする」とGitに指示します。
- ローカルリポジトリ 📂
- 自分の PC 内にある、ファイルの変更履歴を記録する場所です。
-
git commit
で変更をローカルリポジトリに保存し、「リモートリポジトリに送る準備をする」とGitに指示します。
- リモートリポジトリ 🌍
- ネットワーク上にある、複数の人でファイルの変更履歴を共有する場所です。
-
git push
でローカルリポジトリの変更をリモートリポジトリに送信すると、他の人と変更を共有できます。
📌 各ステップの操作コマンド
ステップ | コマンド | 説明 |
---|---|---|
作業ディレクトリ → ステージング | git add <ファイル名> |
作業中のファイルを次のコミット対象に追加 |
ステージング → ローカルリポジトリ | git commit -m "コミットメッセージ" |
ステージングされた変更をローカルに記録 |
ローカルリポジトリ → リモートリポジトリ | git push origin <ブランチ名> |
ローカルの変更をリモートにアップロード |
Gitの流れを理解すれば、「どの段階でミスしたか?」がわかり、落ち着いて変更を戻すことができます。
git reset
コマンド
💻 Git の reset
コマンドは、変更を元に戻すための便利なツールで 主に add
や commit
の後 に使われます🔄✨
git reset
には、3つの --soft
、--mixed
、--hard
というオプションがあります。
オプション | 説明 |
---|---|
--soft |
コミットを取り消すが、ステージングと作業ディレクトリの変更はそのまま |
--mixed (デフォルト) |
コミットとステージングを取り消すが、作業ディレクトリの変更はそのまま |
--hard |
すべての変更を取り消し、元に戻せない |
git add
したけど戻したい
1️⃣ ✅ タイミング:まだ commit
していない場合
✅ 目的:git add
でステージングした変更を取り消す
✅ コマンド:
git reset <ファイル名>
指定したファイルのステージングを解除します(作業ディレクトリの変更はそのまま)
🔄 すべてのステージングを解除する場合
git reset
--mixed
オプションがデフォルトのため、 git reset --mixed HEAD
と同じ動作になります。
git commit
したけど戻したい
2️⃣ ✅ タイミング:まだ 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つ前」を指し、直前のコミットを取り消すことができます。
具体例
🚀 具体例
例えば、以下のような状況を考えてみましょう👀
- ファイル
sample.txt
を変更し、git add
でインデックスに追加した。 -
git commit -m "commit 1"
でコミットした。 - ファイル
sample.txt
を再度変更し、git add
でインデックスに追加した。 -
git commit -m "commit 2"
でコミットした。
この状態で git reset --soft HEAD~1
を実行すると、
- HEAD は "commit 1" を指すようになります。
- インデックスには、"commit 2" で行った変更が残っています。
- 作業ディレクトリには、"commit 2" で行った変更が残っています。
この後、git commit -m "commit 2'"
などとして再度コミットすることで、変更をやり直すことができます。
👀 メモ
-
--soft
オプションは、変更をインデックスと作業ディレクトリに残すため、誤って変更を消してしまう心配がありません。 - ただし、変更内容をコミットし直す必要があります。
git push
したけど戻したい
3️⃣ ✅ タイミング:すでにリモートに 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