Gitで最新のローカルコミットを元に戻すには?

誤って間違ったファイルをGitにコミットしてしまいましたが、そのコミットをまだサーバーにプッシュしていませんでした。

どうすればローカルリポジトリからそれらのコミットを取り消すことができますか?

ソリューション

コミットの取り消しとやり直し

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)

1.元に戻したい内容です。 2.2. これは作業ツリー (ディスク上のファイルの状態) には何もしませんが、コミットを取り消し、コミットした変更をステージングしないままにします (そのため、git status に "Changes not staged for commit" として表示されるので、コミットする前に再度追加する必要があります)。もし、前のコミットにさらに変更を加えたり、コミットメッセージ1を変更したりしたいだけなら、代わりに git reset --soft HEAD~ を使うことができます。 3.3. 作業ツリーのファイルを修正します。 4.新しいコミットに含めたいものを git add してください。 5.5. 変更をコミットし、古いコミットメッセージを再利用します。reset は古いヘッドを .git/ORIG_HEAD にコピーしました。-c ORIG_HEAD を指定して commit を実行するとエディタが開き、最初は古いコミットのログメッセージが含まれていて、それを編集することができます。メッセージを編集する必要がなければ、-C オプションを使うこともできます。

ただし、インデックスに新しい変更を加えていた場合、commit --amend を使用すると、以前のコミットに追加されてしまうことに注意してください。

コードがすでにサーバーにプッシュされていて、履歴を上書きする権限(リベース)を持っている場合は、次のようにします。

git push origin master --force

こちらの回答も参考にしてみてください。

https://stackoverflow.com/questions/34519665/how-to-move-head-back-to-a-previous-location-detached-head/34519716#34519716

上記の回答では、元に戻したいSHA-1を見つけるために使用する git reflog が示されています。元に戻したい箇所が見つかったら、上記で説明した一連のコマンドを使用します。


1 しかし、もしあなたが commit message を間違えただけなら、以前のコミットに戻す必要はないことに注意してください。より簡単な方法は、git reset (それ以降に行った変更を元に戻す) してから git commit --amend を実行することです。これにより、最後のコミットメッセージがあらかじめ入力されたデフォルトのコミットメッセージエディタが開きます。

2 HEAD~ は、HEAD~1 と同じです。

解説 (17)

ファイルを追加・削除することで、思い通りの状態にすることができます。

git rm classdir
git add sourcedir

その後、コミットを修正します。

git commit --amend

以前の誤ったコミットは、新しいインデックスの状態を反映して編集されます。言い換えれば、最初から間違いを犯していなかったかのようになります。

この作業は、まだプッシュしていない場合にのみ行うようにしましょう。もしプッシュしているのであれば、普通に修正をコミットする必要があります。

解説 (1)
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

または

git reset --hard HEAD~1

**警告です。上記のコマンドを実行すると、コミットしたかった .java ファイル(およびその他のファイル)の修正が永久に削除されます。

HEAD-1へのhard reset` は、作業コピーを間違ったコミットの前のコミットの状態にします。

解説 (2)