【派閥別】Gitのコミットを間違えたときの対処法まとめ
追記:たくさんブクマしていただいて驚いております。ブクマコメントだと、やはり git push -f は反則だろという意見がサイレントマジョリティのようですが、そこはそれ、自 己 責 任
追記2(2011/11/07):commit messageをミスった場合について訂正しました。 git rebase -i で直近のコミットを "edit" にして修正すると、 「--amend使えや」と言われるようです。
gitのコミットをしくじった時の対処法について、一覧性の高いまとめがなかったので作りました。正確さは保証できないので、コマンド名ヒントに自分でググって下さい
ほかのやり方があるよ、間違ってるよ等のご指摘歓迎です。
派閥別 gitでコミットミスった時のまとめ | ├─ 一人で使ってるよ | | | ├─ 手元に変更を取り戻したいよ(1)(そうだね、add忘れだね派) | | add忘れなら、必要ファイルをaddした後に | | $ git commit --amend | | それ以外 | | $ git reset --soft HEAD^ | | でコミットがなかったことになる. | | 追加でコミットしてしまってから git rebase -i でコミット合体という手もあるけど二度手間。 | | | ├─ 手元に変更を取り戻したいよ(2)(commit messageのスペルミスったよ派) | | これも同じで,何もaddしていない状態で一切変更せずに | | $ git commit --amend | | とすれば、直ちにコミットメッセージを変更できる. | | | ├─ 変更捨てたいよ(なんでコミットしたし派) | | git reset --hard HEAD^ | | | ├─ いくつか前のコミットだよ(いまさら派) | | $ git rebase -i | | を使ってコミットの順番を入れ替えて、矛盾がないことを確認した上で | | $ git reset --soft HEAD^ | | とかがおすすめ。いきなり消しちゃってもいいと思うけど。 | | | └─ 自分しか使ってない上流にpushしたよ(はぐれ刑事Github派) | remoteリポジトリを誰も使っていないことが確信できるなら、 | $ git reset HEAD^ --hard | $ git push origin -f | でリモートリポジトリを強制的に編集できる。あるいは | $ git push -f origin HEAD^:master | └─ 複数人で使ってるよ | ├─ まだpushしてないよ(間一髪派) | 一人で使っている時と一緒 | └─ もうpushしちゃったよ | ├─ まだ誰もpullしてないよ(こっそり直しちゃえ派) | 他の人がpullしていないことに確信が持てるなら、 | リモートのコミットを直接削除できる。ただし素人にはお勧めできない。 | 通常の手段でローカルのコミットを取り消した後、-f オプションでpushする。 | $ git reset HEAD^ --hard | $ git push origin -f | あるいは一行で | $ git push -f origin HEAD^:master | ├─ もう誰かpullしちゃってるよ(恥を忍んで直す派) | リモートを強制的に変更すると、すでにpullした人からは「あったはずのコミットが無い」 | という事態になるので大混乱を招くから、そのようなことはできない。 | よって、履歴は保持した上で"逆の"コミットを適用する。 | $ git revert HEAD^ | $ git push | これにより、「元に戻した」という内容の新しいコミットが作られるので、 | すでに誰かがpullしてしまっていても矛盾しない。 | └─ さらに誰かが(依存する)変更をpushしてるよ(どうしてこうなった派) 涙ふけよ
実はまだコミットしてないよ(君の居場所はここじゃない派)
addでステージングしたファイルをアンステージングするには、
git rm --cached <ファイル名>
で削除できる.
参考URL:
http://d.hatena.ne.jp/mrgoofy33/20100910/1284069468
http://redtower.plala.jp/2010/09/30/git-git-reset.html
http://hylom.net/2011/03/01/how-to-reset-remote-git-branch/
http://d.hatena.ne.jp/tmtms/20101221/git
http://d.hatena.ne.jp/mumoshu/20090408/1239202846