HOWTO · Git

ローカルリポジトリで最後の Git コミットを元に戻す

最後の gitcommit を元に戻し、ファイルの変更を保持できます。

この記事では、Git で最新のコミットを元に戻す方法について説明します。これは、コミットによって導入された変更をリモートリポジトリにプッシュする前に削除する場合に便利です。

すぐに飛び込みましょう。

Git のファイルを変更せずに最後のコミットを元に戻す

以前の変更がファイルに加えられている間にコミットを元に戻す方法について説明することから始めます。これを行うには、-soft 引数を指定した git reset コマンドを使用して、ファイルの内容を保持するように Git に指示します。

$ git reset --soft HEAD~1

上記のコマンドは、HEAD の最後のコミットを削除します。

例を見てみましょう。これがローカルリポジトリのコミット履歴です。

$ git log --oneline --graph
* c5bf6c8  (HEAD -> master) Added a new file named "file.txt"
* 3b641e0  Second commit
* 21ca1e7  Initial commit

git reset コマンドを実行して、ローカルリポジトリへの影響を確認しましょう。

git リセット

上記の出力は、file.txt がインデックスに含まれているが、コミットが存在しないことを示しています。ファイルに変更を加えて、再度コミットすることができます。

$ git log --oneline --graph
* c5bf6c8  (HEAD -> master) (HEAD)
* 3b641e0  Second commit (HEAD~1)
* 21ca1e7  Initial commit (HEAD~2)

コマンド $ git reset --soft HEAD~1 は最後のコミットを削除します。最後の 2つのコミットを削除する場合は、代わりに $ git reset --soft HEAD~2 などを使用します。

場合によっては、コミットとファイルを削除したいことがあります。以下に示すように、-hard オプションを指定して git reset コマンドを使用します。

$ git reset --hard HEAD~1

上記のコマンドは、コミットに関連するすべての変更をインデックスと作業ディレクトリから削除します。

例を見てみましょう。これが私たちのコミット履歴のビジュアルです。

$ git log --oneline --graph
* c5bf6c8  (HEAD -> master) Added a new file named "file.txt"
* 3b641e0  Second commit
* 21ca1e7  Initial commit

このシナリオでは、最後のコミットを削除し、変更を削除します。

私たちは走る:

$ git reset --hard HEAD~1
HEAD is now at 3b641e0 Second commit

git status コマンドを実行して、リポジトリの状態を確認しましょう。

git ステータス

上記の出力は、Git がインデックスと作業ディレクトリからファイルを削除したことを示しています。

また、最後のコミットを元に戻し、作業ディレクトリであるがインデックスに変更を保持する必要がある場合もあります。これを行うには、以下に示すように、--mixed オプションを git reset コマンドに追加します。

$ git reset --mixed HEAD~1

例を見てみましょう。これがコミット履歴の現在の状態です。

$ git log --oneline --graph
* c5bf6c8  (HEAD -> master) Added a new file named "file.txt"
* 3b641e0  Second commit
* 21ca1e7  Initial commit

私たちは走る:

$ git reset --mixed HEAD~1

ファイルは作業ディレクトリに表示されているはずですが、インデックスには表示されていません。git status コマンドでこれを確認しましょう。

git ステータスで確認

file.txt が追跡されていないファイルの下にあることがわかります。これは、変更を保持しながらコミットを元に戻すもう 1つの方法です。