背景:
[ コミット履歴 ] ← HEAD
↑
[ ステージ領域 ](インデックス)
↑
[ 作業ツリー ](実際のファイル)
1.未追跡のファイル(untracked files)を削除
未追跡のファイルとは新規のものでgit管理されていないファイル
git clean -f → 未追跡ファイルをすべて削除します。
git clean -n → 削除される予定のファイル一覧だけ表示(安全) ※削除前に確認したい場合
▼より強力な使い方
コマンド | 説明 |
---|---|
git clean -f | 未追跡の通常ファイルを削除 |
git clean -fd | 未追跡のディレクトリも含めて削除 |
git clean -fx | .gitignore で除外されたファイルも削除(危険) |
git clean -nfd | 実行前に削除対象を表示(安全確認) |
2.作業ツリー(変更した)のファイルの戻し
git restore <ファイル名>
例:git restore main.cpp
git add
後(未コミット)では ステージに追加済み 、git restore実行するなら、作業ツリーのみ元に戻る(ステージは残る)。
▼git restoreとgit cleanの違い
コマンド | 対象 | 動作 | 破壊的? |
---|---|---|---|
git restore main.cpp |
追跡ファイル | 最新コミットの状態に戻す(変更を破棄) | ✅ はい(変更は消える) |
git clean -f main.cpp |
未追跡ファイル | ファイル自体を削除する | ✅ はい(ファイルごと消える) |
※一番大きな違いは追跡なのか、未追跡なのか。
3.ステージ内のファイルを戻し
Gitで「ステージ内のファイルを削除」するには、つまり「git add でステージングされた状態から外す(アンステージする)」には、以下のようにします:
git restore --staged <ファイル名>
git reset <ファイル>
▼git resetでのステージ戻し
コマンド | 意味 | 正しい? |
---|---|---|
git reset --mixed HEAD |
ステージをHEADに戻す(すべてのファイル) | ✅ |
git reset HEAD file1 |
file1 だけステージ解除 |
✅ |
git reset --mixed HEAD file1 |
オプションとファイル指定の併用は不可 | ❌ |
※git reset
とgit reset --mixed HEAD
は同じです。
4.コミットを戻し
▼git resetでのコミット戻し
モード | コマンド例 | ステージ | 作業ツリー | 備考 |
---|---|---|---|---|
--soft |
git reset --soft HEAD~1 |
✅ 残る | ✅ 残る | 最新のコミットだけ取り消す(変更は残る) |
--mixed (デフォルト) |
git reset HEAD~1 |
❌ 取り消し | ✅ 残る | ステージも戻すが、ファイルは残る |
--hard |
git reset --hard HEAD~1 |
❌ 取り消し | ❌ 消える | すべて巻き戻し(完全に消える)⚠危険 |
▼質問:git reset HEADとgit reset HEAD^とgit reset HEAD~1の違い
コマンド | 意味・対象 | 主な用途 |
---|---|---|
git reset HEAD |
ステージ(インデックス)のみ | git add を取り消したい時 |
git reset HEAD^ |
コミット1つ前に戻る | 最新のコミットをなかったことに |
git reset HEAD~1 |
コミット1つ前に戻る(^ と同じ) |
同上(複数前に戻す時は ~n ) |
▼git restoreとgit reset
したいこと | 適切なコマンド |
---|---|
編集したファイルを最新コミットの状態に戻したい | git restore ファイル名 |
git add したのを取り消したい |
git restore --staged ファイル名 または git reset ファイル名 |
間違ってコミットしたので、なかったことにしたい(内容は残す) | git reset --soft HEAD~1 |
間違ってコミットしたのですべて取り消したい(変更も不要) | git reset --hard HEAD~1 |
5.整理:
質問:①元ファイル⇒②編集した⇒③git add⇒④git commit⇒⑤再編集した git restore実行する場合、どの状態に戻ったか
①元ファイル
②編集した
③git add
④git commit
⑤再編集した →この時点で、作業ツリーと最新のコミットに差分がある状態。
✅ この時点で git restore main.cpp を実行した場合
main.cpp は、「直前のコミットの状態(④の内容)」に戻ります。
つまり、⑤の編集内容は破棄されて、④のコミット状態になる。
⑥git add
✅ この時点で git restore main.cpp を実行した場合
git restore main.cpp → 作業ツリーがコミット状態に戻るが、ステージの変更はそのまま残る
git restore --staged main.cpp → ステージの内容もコミットに戻す(git reset HEAD main.cpp に近い)
状態確認したい場合は:
git status
git diff
git diff --staged
コメント欄