人間誰しも間違えを犯す。今回は間違えてコミットしてしまった場合の対処を見ていこう。
amend
commitしたあとに間違いに気づくことは多い。そういったときは修正したコミットを作成しamendオプションをつけるとよい。
やってみよう!
デスクトップで以下のコマンド順番に実行して1つコミットオブジェクトを作成する。
$ mkdir test $ cd test $ git init $ touch file1.txt $ echo "lineOne" >> file1.txt $ git add . $ git commit -m"first commit"
コミットをしたが直後にOneは数字にしなければならなかったことに気づく。
amendを利用して歴史を書き換えよう。
$ vi flie1.txt ~Oneを1に書き換える $ git add . $ git commit --amend
エディタが立ち上がるのでコミットメッセージを修正する。特に変更の必要がなければそのまま保存をエディタを閉じる。これで無駄なコミット残らずに修正済みの歴史だけが残る。このamendはコミットメッセージだけを書き換えたいときなどにも有効だ。
reset –hard
先程は間違えを修正したが、ctrl+zのごとくそのコミットがまったくない以前の状態にもどすのがreset –hardださきほどの続きから以下を入力しよう。
$ echo "mistake" >> file1.txt $ git commit -am"second commit"
-am オプションを使うとaddとcommitを一度に行える。
しかし、この変更は全く不要だったことに気づく。
ctrl+zのごとく以前の状態にもどりたい。
そういった場合は以下のコマンド打つ。
$ git reset --hard HEAD~
これでさきほどの間違えたコミットは消え去り、ファイルの内容からもmistakeという文字が消えた。つまり今回の作業をする前の状態に全てが戻ったということだ。
HEADというのは現在のブランチの最新のコミットを指すポインタで、これに~(チルダ)をつけることで一つ前のコミットを指すことができる。
その結果,一つ前のコミットの状態に作業フォルダも含めてリセットされた。
ちなみにHEAD~2と~の後ろに数字をつけることでもっと過去の状態にresetすることもできる。仮に~2とすると2つ前のコミットの状態にリセットされる。
rebase -i
rebaseを使うと歴史を変えられる、やってみよう。
まずは以下のようにわざとスペルミスをしてコミットする。
$ echo "lien2" >> file1.txt $ git commit -am"1行追加"
その後、スペルミスを修正しコミットする
$ vi file1.txt ~~~lien2をline2に修正し保存する~~~ $ git commit -am"fix typo"

このスペルミスをした歴史をなかったことにしたい。。。
HEADから2つ前までのコミットをrebase
$ git rebase -i HEAD~2
消したい歴史にfixup(またはf)と書き換え保存する

タイプミスした歴史が消えてコミットログがきれいになった!

このようにrebaseを使うと歴史を変えることができる。ただ、rebaseは歴史を変える大手術なので、共同開発をしている際には注意していだきたい。
まとめ
もしコミットをしたあとに間違いに気づいた場合、もし修正して履歴を残していきたいのならamendを、そうではなくctrl+zのごとくスパッと以前の状態に戻したい場合はreset –hardを使っていくとよいだろう。
コメント