コミットされていない変更を Git で削除

Stewart Nguyen 2023年1月30日
  1. git checkout を使用して、Git のコミットされていない変更を削除する
  2. git reset を使用して、Git のコミットされていない変更を削除する
  3. git stashgit stash を使用して、Git のコミットされていない変更を削除する
コミットされていない変更を Git で削除

この記事では、ローカルリポジトリに加えたコミットされていない変更を元に戻す方法について説明します。

機能を使用する場合、最初に新しいファイルを作成し、既存のファイルに変更を加えてから、いくつかのファイルを削除する場合があります。最終的に、それはすべて間違っていることに気付き、前のコミットに戻る必要があります。私たちは何をすべき?

$ echo 'Add new implementation' > feature.txt
$ echo 'Enhance exising feature' >> file.txt
$ git add file.txt
$ rm deprecated_feature.txt
$ git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   file.txt

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	deleted:    deprecated_feature.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	feature.txt

それを達成する方法はいくつかあります。

git checkout を使用して、Git のコミットされていない変更を削除する

このコマンドは、追跡されたファイルのコミットされていない変更を元に戻します。追跡されたファイルは、通常、git add によって追加された後に git が認識しているファイルです。

$ git checkout .
Updated 2 paths from the index
$ git status
On branch main
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	feature.txt

nothing added to commit but untracked files present (use "git add" to track)

git add を介してファイルがステージング領域にすでに追加されている場合、git checkout は機能しないことに注意してください。

$ echo 'Enhance exising feature' >> file.txt
$ git add file.txt
$ git checkout file.txt
Updated 0 paths from the index
$ git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   file.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	feature.txt

上記の例では、このファイルはステージング領域にあるため、file.txt への変更は元に戻されません。

git reset を使用して、Git のコミットされていない変更を削除する

ステージング領域でコミットされていない変更を削除するには、次の手順を実行する必要があります。

  1. git reset を使用してステージング領域からファイルをアンステージします。
  2. git checkout を使用して変更を元に戻します。
$ git reset file.txt
Unstaged changes after reset:
M	file.txt
$ git checkout file.txt
Updated 1 path from the index
$ git status
On branch main
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	feature.txt

nothing added to commit but untracked files present (use "git add" to track)

git reset を使用してコミットされていない変更を削除する別の方法は、オプション --hard とパラメータ HEAD を使用することです。

$ git reset --hard HEAD
HEAD is now at 1e087f5 Make some change to file.txt
$ git status
On branch main
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	feature.txt

nothing added to commit but untracked files present (use "git add" to track)
  • --hard オプションは、現在の状態と最後の引数のコミットの間のすべての変更をスローするように Git を指定します。そのため、このコマンドは危険であると見なされ、git status を実行して作業ファイルを確認した後に使用する必要があります。
  • 最新のコミットの HEAD エイリアス。

git stashgit stash を使用して、Git のコミットされていない変更を削除する

git checkoutgit reset の欠点は、追跡されていないファイルを削除できなかったことです。feature.txt は、これらのコマンドを実行した後も存続します。

最初の例を考えてみましょう。

$ echo 'Add new implementation' > feature.txt
$ echo 'Enhance exising feature' >> file.txt
$ git add file.txt
$ rm deprecated_feature.txt
$ git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   file.txt

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	deleted:    deprecated_feature.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	feature.txt

ステージングされたファイル、追跡されているがステージングされていないファイル、および追跡されていないファイルを含む、コミットされていないすべての変更を削除します。git stash にきちんとアプローチします。

git stash を使用すると、変更を保存できますが、git commit は必要ありません。コミットされていないファイルの一時ストレージとして機能します。

一時ストレージに変更を追加した後、それらが保存されているものをドロップするように Git に指示します。したがって、コミットされていない変更はすべてなくなります。

$ git add .
$ git stash
Saved working directory and index state WIP on main: 16b9767 deprecated_feature.txt
$ git stash drop
Dropped refs/stash@{0} (aebeb2cbdcec917331f5793ef1238f5a525d29ec)
$ git status
On branch main
nothing to commit, working tree clean

要約すると、コミットされていない変更を削除するためのいくつかのアプローチがあります。

  1. git checkout は、ファイルがステージング領域にない場合にのみ役立ちます。
  2. git reset は、ステージング領域にあるが、追跡されていないファイルの変更を削除できない変更に役立ちます。git checkout との組み合わせが必要です。
  3. git reset --hard HEAD は上記より短い場合がありますが、潜在的に危険です。
  4. git stashgit add . 追跡されていないファイルを含むすべてを削除できます。

関連記事 - Git Commit