Gitでまだpushしていない直前のCommitを取り消す方法

作成日:

以下の人向けです。

  • git commit の際に

    • 誤って無駄なファイルなどを入れてしまった

    • 誤って無駄な修正を入れたままにしてしまった

  • git push はまだ実施していない

方法#

commitする前に戻す#

git reset HEAD~

この操作ではaddおよびcommitしたという事実だけが取り消され、ファイルの修正内容などは現在の状態から変更されません。

ファイル修正を実施#

ここで入れ忘れた修正を追加するなど、取り消して実施したかった内容を実施してください。

間違ったファイルを入れてしまった人はそのまま次へ。

ファイルを再度コミット#

git add を利用して修正したファイルや入れ忘れたファイルを追加していきます。

git add <files>

そして git commit を実施。 以前のコミットメッセージを使いまわせるので、特に修正がない場合はそのままコミット。

git commit -c ORIG_HEAD

-c ORIG_HEAD により以前のコミットメッセージを使いまわす設定となっているため、メッセージも書き直したい場合には普通にcommitすればOKです。

git commit

解説#

git reset HEAD~#

git reset は undo に相当するコマンドです。 git reset の後にモードを指定するオプションが指定でき、その後に戻すべきコミットを指定します。以下のような書式です。

git reset [<mode>] [<commit>]

ここではモードは省略されているため --mixed というモードが指定されたのと同じ挙動になります。

そして今回戻り先として指定しているコミットは HEAD~ です。これは慣れないと意味が分かりづらいですが、

  • HEAD は最新コミット

  • HEAD~ その1つ前のコミット

  • HEAD~~ 更にもう1つ前のコミット

というように ~ をつけることで最新コミットから1つずつ遡ることができます。

今回の場合 HEAD~~ が1つなので最新コミットの1つ前、つまり直前のコミットに戻ります。

ちなみに、今回省略したモードには以下のようなものが指定できます[1]

よく使うgit resetのモード

Option

効果

--soft

git commit を実行する前の状態に戻る。 ( git add した後の状態)

--mixed

git add を実行する前の状態に戻る。

--hard

--mixed の状態からさらにファイルの修正もすべて元に戻す。(危険)

git commit -c ORIG_HEAD#

-c オプションは、その後にコミットを指定し、そのコミットのメッセージを使いまわすことができるものです。

ORIG_HEAD はある種の破壊的な操作、危ない操作を行った際、1つ前の HEAD の状態を保持しておくための特殊な変数です( 参考 )。 git reset は場合によっては危険な操作ですのでこの ORIG_HEAD が設定されます。

そして、1つ前の HEADというのは何かについてHEAD は最新のコミットの別名です。したがって git reset HEAD~ をした直後であれば、1つ前の HEAD は間違えて実施してしまった commit を指すことになります。

Git