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も取り消すなら、上の手順で行う。