修正間違い

作業ツリーに手を入れたが、間違いをまだコミットしていない場合は、 以下のようにして作業ツリーを最後にコミットした状態に戻すことができます。

$ git reset --hard HEAD

コミットした後ですべきではなかったと気が付いた時は、 2つの異なる解決方法があります:

  1. 変更を取り消す新しいコミットを作成する。 既に間違いを公開してしまった場合にはこれは正しいやり方です。
  2. 元に戻して古いコミットを修正する。 履歴を公開した後の場合は、決してこれをしてはいけません; 通常、git は プロジェクトの履歴が変更されないことを想定しています。 そして、履歴が変更されたブランチからは正しくマージを繰り返すことが できません。

新しいコミットで間違いを修正する

前の変更を取り消す新しいコミットを作成するのはとても簡単です; 単に 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