読者です 読者をやめる 読者になる 読者になる

本当は怖い情報科学

情報系大学院生の趣味&実益ブログ。

【派閥別】Gitのコミットを間違えたときの対処法まとめ

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

【広告】