はじめに
不具合の調査って、時々、入れ込んだ箇所がわかるまで、コミットを一つずつ戻していく作業になったりしますよね。そんな時のお供が git reset
コマンドです。
手順
まずはコミットを確認
git log
コマンドでコミットのハッシュ値を確認します。
一度に多くのログを表示させたい場合、--oneline
オプションが便利です。
ここでは「お気に入り機能」に取り掛かる前の f2940ec
(下から2行目)に戻したいとします。
$ git log --oneline -n 20
2a2584e (HEAD -> v1.7.4_dev, origin/v1.7.4_dev, origin/master, origin/HEAD, master) v1.7.3 リリース
278f6b2 Merge pull request #165 from yokoba569/v1.7.3_dev
7a23fb5 (origin/v1.7.3_dev, v1.7.3_dev) Merge pull request #164 from yokoba569/#418_お気に入り対応
2394231 (origin/#418_お気に入り対応, #418_お気に入り対応) refs #418 DD対応 修正漏れ
8daa0f3 refs #418 お気に入り機能
f2940ec Merge pull request #163 from yokoba569/#445_起動変更オプション変更
a41ef31 ....
特定のコミットに戻す
git reset
コマンドで戻します。--hard
で変更内容をすべてクリアできます。
--soft
なら、変更内容がコミットされていない状態で保持されます。
$ git reset --hard f2940ec
HEAD is now at f2940ec Merge pull request #163 from yokoba569/#445_起動変更オプション変更
最新の状態に戻す
調査が終わったり、reset するコミットを間違っちゃったというときはこれを使いましょう。
git reflog
コマンドで戻したい状態を確認し、再び git reset
コマンドです。
-
git reflog
コマンドにより作業前の状態がHEAD@{2}
であることがわかります。$ git reflog -n 3 f2940ec (HEAD -> v1.7.4_dev) HEAD@{0}: reset: moving to f2940ec 2a2584e (origin/v1.7.4_dev, origin/master, origin/HEAD, master) HEAD@{1}: checkout: moving from master to v1.7.4_dev 2a2584e (origin/v1.7.4_dev, origin/master, origin/HEAD, master) HEAD@{2}: commit: v1.7.3 リリース
-
git reset
コマンドで作業前のHEAD@{2}
に戻します。
変更差分をクリアしていい場合は--hard
をつけましょう。
(保持したい場合は--soft
ですが、あまり使わないかも?)$ git reset --hard HEAD@{2} HEAD is now at 2a2584e v1.7.3 リリース
追記:コミット番号指定でも出来ました
$ git reset --hard 2a2584e
HEAD is now at 2a2584e v1.7.3 リリース
最後に
特定のコミットまで戻す方法は以上となります。
不具合の調査って、イライラしちゃうこともありますよね。
そんな時に git のコマンドでまで手間取りたくはないものです。
この記事が一助になれば幸いです。