作業ツリーに手を入れたが、間違いをまだコミットしていない場合は、 以下のようにして作業ツリーを最後にコミットした状態に戻すことができます。
$ git reset --hard HEAD
コミットした後ですべきではなかったと気が付いた時は、 2つの異なる解決方法があります:
前の変更を取り消す新しいコミットを作成するのはとても簡単です; 単に git-revert(1) コマンドに間違ったコミットへの参照を 渡すだけです;例えば、直前のコミットを元に戻すには:
$ git revert HEAD
この操作により、HEAD の変更を取り消す新しいコミットが作成されます。 また、新しいコミットに対するコミットメッセージが促されます。
より過去の変更を取り消すこともできます、例えば、2つ前の場合:
$ git revert HEAD^
この場合 git はそれ以前の変更はそのまま残し、指定したコミットの変更だけを 取り消そうとします。指定コミットより後の変更内容が取り消す変更内容とオーバーラップ している場合は、マージの解決 の場合と同じく、 コンフリクトを手動で解決するよう促されます。
問題のあるコミットが直前のコミットであり、まだ公開していない場合は、 単に`git reset`を使用した削除を行うと良いです。
また、代わりに、作業ディレクトリを編集し間違いを訂正した後、索引を更新 することもできます。新しいコミットの作成 で 示した手順で作業していたなら、次のようにします。
$ git commit --amend
これにより、古いコミットが変更内容が記録された新しいコミットに置き換わり、 過去にコミットしたメッセージを編集することもできます。
再注意となりますが、他のブランチに既にマージしているコミットに対しては 決してこの操作を行わないでください;その場合は、git-revert(1) を使用してください。
履歴内のさらに過去のコミットを置き換えることもできますが、 次章 の上級トピックスとして残しておきます。
以前の間違った変更を取消作業の中で、git-checkout(1) を使用して
特定ファイルの古いバージョンをチェックアウトすると便利な場合があるかもしれません。
これまで branch を切り替える際に git checkout
を使用してきましたが、
パス名が与えられた場合には全くことなる動作をします:
次のコマンド
$ git checkout HEAD^ path/to/file
は、path/to/file をコミット HEAD^ の時の内容で置き換え、 索引の更新も行ないます。ブランチは変更しません。
単にそのファイルの古いバージョンを参照したいだけの時は、 git-show(1) を使用すると、作業ディレクトリを修正せずに そのバージョンのファイルを表示できます:
$ git show HEAD^:path/to/file
あなたが何か複雑な作業をしている途中に、今の作業とは関係のない明らかなバグを みつけたとします。作業を中断してそのバグを処置したいとします。 git-stash(1) を使用すると、現在の作業状態を保存し、 バグ処置をした後 (あるいは、異なるブランチ上で処置を行い、元に戻り)、 作業中の状態に戻すことができます。
$ git stash save "work in progress for foo feature"
このコマンドはあなたの変更を stash
に保存し、
作業ディレクトリをリセットし、索引を現在のブランチの tip に一致
させます。通常の手順でバグの処置をしてください。
... edit and test ...
$ git commit -a -m "blorpl: typofix"
その後、git stash apply
を用いて作業していた時の状態に
戻ることができます。
$ git stash apply