weblog of key_amb

主にIT関連の技術メモ

gitでローカル編集/add/commit/pushを取り消す(まとめ)

svnのときはrevertすればいいのだが、gitではリモートリポジトリにpushするまでのステップ数が多いのでややこしい。各ステップで巻き戻し方が異なるので、使い分けが必要。
この記事でそれらの方法についてまとめる。

最も確実な方法

ローカルリポジトリの変更を完全に破棄して構わない場合、リモートリポジトリから git clone し直すのが最も確実である。
これはたぶん、最後の手段になる。
ただこれだとpushは取り消せないので、そのやり方は後述する。

ローカル編集を消したい。

まだaddすらしていない状態だけど、行った変更を取り消したい。
そんなときは以下を打つ。

git checkout <path>

<path>にディレクトリを指定すれば、再帰的にcheckoutしてくれる。

ワーキングツリーの変更を全部取り消していい場合は、次のコマンドでもいい。

git reset --hard HEAD

ちなみに、pushする前の段階であれば git reset コマンドの使い方を覚えればなんでも取り消すことができる。この使い方についても後述する。

間違ってaddしてしまった!

これを取り消すには以下のコマンドを打つ。

git reset [--hard] HEAD <file>

--hardオプションをつけると、ワーキングツリーの変更も破棄される。
つまり、addとローカル編集をまとめて破棄することが出来る。

--hardオプションなしと同じことは、次のコマンドでも出来る。

git rm [-r] --cached <file>

間違ってcommitしてしまった!

次のコマンドを打つ。

git reset [--soft|--hard] HEAD^

HEAD^はHEADの1つ前のリビジョンである。つまり、間違って2回コミットしてしまったときは、HEAD^^を指定すればいい。

--softオプション、--hardオプション、オプション無しの場合の挙動の違いは次の通り。

  • --softオプション => addされた状態まで戻る。HEADの位置をHEAD^に移動するだけ。
  • オプション無し => addする前まで戻る。--softのときと同様、ワーキングツリーの内容はそのまま。
  • --hardオプション => ワーキングツリーの内容まで含めて、HEAD^の状態まで戻る。ローカル編集は完全に破棄される。

間違ってpushしてしまった!

次のコマンドを打つ。

git push -f origin HEAD^:master

この後、ローカルのcommitも取り消すなら、上の手順で行う。