怖くないgit reset
git reset について
git reset... 怖い!!!
どのサイトに行っても, git resetは操作がログに残らないので, 慎重に!!
といった書き込みが多く, 少しgit reset
恐怖症になっていた.
そこで改めてgit reset
について再勉強した.
参考サイトから大事だと思う部分をpickupさせていただきました. 先人様様です.
git reset についてもまとめてみる - murankの日記
resetは何を操作しているのか.
それは, working tree
とindex
とhead
である.
対象 | 説明 |
---|---|
head | 最新コミットを表す代名詞 |
index | Addされたファイルを記憶する領域 |
working tree | 作業中のファイルを記憶する領域 |
操作対象を決める --soft と --hard オプション
resetには--soft
と--hard
というオプションがある.
これは, どの操作対象をresetするかを決めるオプションである.
オプション | HEAD | index | working tree |
---|---|---|---|
--soft | ○ | ||
no option | ○ | ○ | |
--hard | ○ | ○ | ○ |
つまり,
git reset <何を戻す?> <どこまで戻す?>
というコマンドである.
git resetの動作
何となく, resetの機能は掴めてきた.
とは言っても, 実際にどのように動作しているのかイメージしづらい.
ここを見ると, head, index, working treeの動きが視覚的に見てわかりやすい.
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について簡単にまとめた.