前置き
自分用覚書なので適当です。
注意
この記事は、git でやらかしたあれこれを『人知れず「なかったことにする」』ための方法が主になっているので、リモートに push
したあとには絶対しないように。push
したあとに reset
して、あらたに別の commit
をしてからの push -f
などは、間違ってもしてはいけません。
注意2 (2020-08-06追記)
なにぶん古い記事なので、一部コマンドが最新の形態とは異なる部分があります。(後方互換性があるから大丈夫ですが。)
気が向いたら修正していこうかと思っています。
なかったことにする
add をなかったことにする
すでに git の管理下にあるファイルの場合
$ git reset HEAD <file>
git の管理下にまだなかったファイルを add した場合
$ git rm --cached <file>
管理下になかったファイルの場合、よくよく考えてみれば当然だが、戻るべきコミットが存在しないから reset では戻れない。しかたがないので rm で直接管理外とする。
commit をなかったことにする
commit したことをなかったことにする(編集内容はそのまま)
$ git reset --soft HEAD^
--soft
は HEAD の位置だけが移動する
commit をまるごとなかったことにする(編集内容もなかったことにする)
$ git reset --hard HEAD^
commit をやり直す
足りないファイルを追加するとか
不足していたファイルを add した後
$ git commit --amend
コメントを書きなおす(直前のコミットに対して)
コミットした直後にコメントが間違っていたことに気づいた場合
$ git commit --amend
すかさず --amend 付けてコミットすればよい。
コメントを書き直す(履歴をさかのぼって)
いくつかコミットをしたあとに、過去のコミットのコメントが間違っていたことに気づいた場合
$ git log --oneline
aaaaaaa (HEAD -> main) 正しいコメント
bbbbbbb 間違ったコメント
ccccccc 正しいコメント
rebaseで間違っているコミットの一つ前に戻り
$ git rebase -i ccccccc
pick aaaaaaa 正しいコメント
pick bbbbbbb 間違ったコメント
pickをeditに書き換えてエディタを終了
pick aaaaaaa 正しいコメント
edit bbbbbbb 間違ったコメント
amendでコメントを修正して
$ git rebase -i ccccccc
Stopped at bbbbbbb... 間違ったコメント
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
$ git commit --amend
continueでrebaseを完了させる
$ git commit --continue
付けてはいけないのにうっかり --amend をつけてコミットしてしまった
$ git reset HEAD@{1}
コマンド実行履歴などを使っていると、うっかり amend を付けてはいけない時に付けてしまうことがたまにある。そのような場合、単に git reset --hard HEAD^
では前のコミットは戻ってこない。すでに amend でコミットそのものが編集されてしまっているので。
そこで reflog を使用して元に戻す。
ちなみにreflogを使うと、単純なコマンド使用では回復できない状態でも、よほど致命的なことがない限りログをさかのぼることができて、いざというときに有用。
merge をなかったことにする
$ git reset --hard ORIG_HEAD
ファイルの編集をなかったことにする
$ git checkout HEAD -- <file>
編集したファイルを、元あった場所から取り直してくるということ。
なお、うっかりファイルを削除した場合でもこれで取り直せる。
rmしたことをなかったことにする
git restore --staged <file>
git restore <file>
(多分)一発で戻すことはできなくて、一旦stageから降ろしてきた後に最終的になかったことにします。
git の管理下にあることをなかったことにする
$ git update-index --assume-unchanged <file>
例えば配布はするけど管理は各リポジトリごとに別々で行いたい(一例として、環境に依存する設定ファイルとか)場合に重宝する。
なお、元に戻したいときは
$ git update-index --no-assume-unchanged <file>
とする。
(http://qiita.com/usamik26/items/56d0d3ba7a1300625f92 を参考にさせていただきました。)
後書き
なかったことにするのに revert
については触れないのか?と思った方もいるでしょう。しかし、revert
はある意味では commit
をなかったことにしていますが、commit
をなかったことにしたことをなかったことにはしません。commit
を取り消したことがちゃんとログに残ります。ですので、この記事の趣旨とは外れるため、あえて触れませんでした。