はじめに
不具合の調査って、時々、入れ込んだ箇所がわかるまで、コミットを一つずつ戻していく作業になったりしますよね。そんな時のお供が 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 のコマンドでまで手間取りたくはないものです。
この記事が一助になれば幸いです。