See the Elephant

1992生まれのプログラマが書くエンジニアブログ

怖くないgit reset

git reset について

git reset... 怖い!!!

どのサイトに行っても, git resetは操作がログに残らないので, 慎重に!! といった書き込みが多く, 少しgit reset恐怖症になっていた.

そこで改めてgit resetについて再勉強した.

参考サイトから大事だと思う部分をpickupさせていただきました. 先人様様です.

git-resetは結局何を戻すのか - Qiita

git reset についてもまとめてみる - murankの日記

resetは何を操作しているのか.

それは, working treeindexheadである.

対象 説明
head 最新コミットを表す代名詞
index Addされたファイルを記憶する領域
working tree 作業中のファイルを記憶する領域

操作対象を決める --soft と --hard オプション

resetには--soft--hardというオプションがある. これは, どの操作対象をresetするかを決めるオプションである.

オプション HEAD index working tree
--soft
no option
--hard

つまり,

git reset <何を戻す?> <どこまで戻す?>

というコマンドである.

qiita.com

git resetの動作

何となく, resetの機能は掴めてきた.
とは言っても, 実際にどのように動作しているのかイメージしづらい.
ここを見ると, head, index, working treeの動きが視覚的に見てわかりやすい.

d.hatena.ne.jp

git resetを使う場面をケース別に考える.

1 : 間違えて必要のないファイルをindexに追加してしまったのでindexを消去したい. しかし, working treeを消したくない場合.

# indexをHEADの状態に戻す(headは同じ場所を指す).
$ git reset HEAD

2 : 今のコミット上で編集済みのworking tree, indexがある.この2つを保持したまま, 直前のコミットに戻りたい.

# headだけを直前のコミットに戻す.
$ git reset --soft HEAD^

3 : 一度全てを今のコミットの初期状態に戻したい!

# head, index, working treeをHEADの状態に戻す
$ git reset --hard HEAD

4 : 直近のコミットは致命的なバグを含んでいる! n個前のコミットに全てを戻そう!!

# head, index, working treeをn個前のコミットに戻す

$ git reset --hard n個前のコミットのhash値

例えば, コミットした後に直前のコミットにミスが含まれていることに気づいた場合,ケース2で対処できる.

# index, working treeを保持したまま, 直前のコミットに移動
$ git reset --soft HEAD^

# 新しくコミットする
$ git add .
$ git commit -m "replace commit"

しかし, これをやると ログに編集作業が残らない .

git では編集ログはわかりやすく残すことが流儀とされているので, ログが残らない ことはタブーらしい.

だから, git resetは云々... って言われているみたい.

まとめ

理解すれば, git resetもそれほど怖くないとわかった.
あと, git reset でやらかした場合は, git reflogで全ての編集作業を辿れるので,このコマンドは覚えておいたほうがいいと思う.

以上, git resetについて簡単にまとめた.