🏆

【保存版】gitの取り消しコマンドまとめ

2024/03/10に公開

はじめに

gitで操作を間違えた時「resetのオプションなんだっけ...」と忘れてしまうことも多く、その都度違う記事で確認するのもめんどくさいので一つにまとめました。

ぜひブックマークしておいてください。

【注意】
リモートリポジトリ(githubなど)にpushしたコミットは絶対に変更しないでください。

前提

  • 本記事ではindex.htmlというファイルを変更する前提で話を進めます
  • 登場する図では、赤く塗られた部分の変更を取り消すことを意味しています
  • 様々な呼び方がありますが、ここでは分かりやすさを重視し以下の呼び方に統一しています
呼称 説明
ワークツリー 作業スペース。gitコマンドを使用する前の状態
ステージ git addで保存される領域。index。
リポジトリ git commitで保存される領域。ローカルリポジトリのこと。
リモートリポジトリ git pushで保存される領域。GitHubなど。

1. ワークツリー(手元)の変更のみ取り消したい

「ファイルを変更したけど、やっぱり元に戻したい!」を解決します。
この例では、index.htmlに対して変更した内容を取り消します。

コマンド

# 全ての変更を取り消す
git checkout -- . 
# ファイルを指定して変更を取り消す
git checkout <ファイル名>

挙動

ワークツリーの内容をステージの内容で上書きします。

2. ステージに追加した内容を取り消したい

「間違えてステージに追加した!」を解決します。
git addを実行する前の状態に戻すことができます。
ワークツリーでの変更は残っているのでご安心ください。

コマンド

# 全てのステージの変更を取り消す
git reset HEAD
# ファイルを指定してステージの変更を取り消す
git reset HEAD <ファイル名>

挙動

ステージの内容を現在のリポジトリの内容(HEAD)で上書きします。
ワークツリーは変更された状態で残るため、git addを実行する前と同じ状態となります。

ワークツリーからも変更を取り消したい場合は先述のgit checkout <ファイル名>を実行します。

3. コミットを取り消したい(ステージの状態に戻したい)

「間違えてコミットした!」を解決します。
コミット前(ステージ)の状態に戻すことができます。

コマンド

git reset --soft HEAD^

挙動

HEAD^はHEADの1つ前のコミットを意味し、そのコミットまで遡ります。
リポジトリのみ1つ前の状態に戻すため、ステージやワークツリーの変更は残っています。

✅ その問題--amendで解決できるかも?

commitメッセージを間違えた場合など、直前のコミットに対する修正は

git commit --amend

で修正することができます。

4. コミットとステージを取り消したい(ワークツリーで作業した状態に戻したい)

「間違えてコミットして、ステージも取り消したい!」を解決します。
ワークツリーで作業した状態(git addの前)の状態に戻します。

コマンド

git reset HEAD^

# 以下のコマンドと同義
git reset --mixed HEAD^

git resetのオプション(mode)はデフォルトで--mixedとなります。そのため、省略しても同じ結果が得られます。

挙動

リポジトリの変更を取り消し、ステージの変更も取り消します。
ワークツリーの変更内容は残っています。

5. 取扱注意:コミットとステージ、ワークツリーの全てを取り消したい

危険なコマンドのため、使う場合は慎重に考えてください。
ワークツリーの情報も消えてしまうため、コミットに含めた変更が手元からも全て消えてしまいます。

コマンド

git reset --hard HEAD^

挙動

今の変更を全て消し去り、1つ前のコミットの状態に戻します。
事故が起こらないよう、なるべく--softから1つずつ削除していくことをおすすめします。

番外編: untrackedファイル

個人的に結構厄介だと思うのがuntrackedのファイルです。

前回のコミットには存在しなかったファイルで、新規ファイルを作成した時やファイル名を変更した時に発生します。

削除する方法

以下のコマンドで削除します。
ファイルを新規作成していた場合は、ファイル作成前の状態に戻ります。

git clean -f

おわりに

以上、一通りの削除コマンドを紹介しました。

自分が「どの状態を取り消したいのか」を落ち着いて理解すれば対処できます。

安心してgitライフをお過ごしください!

Discussion