はじめに
git reset
には3のオプションがあり、どれを使用するかは状況や目的により大きく異なります。この記事では、状況に応じてどのオプションを選択すべきかを解説します。
git reset とは
変更をある地点まで戻すコマンドです。「ある地点」とはコミット地点のことであり、コミットのHASH値を指定することで、任意の場所まで戻すことができます。
$ git reset [オプション] 戻したい地点のコミット番号
無くしたコミットの差分がどうなるかはオプションで指定することができます。
オプション | 差分の削除有無 | 差分の状態 |
---|---|---|
--soft | 残る | ステージング状態になる |
--mixed | 残る | ステージング状態にならない |
--hard | 削除される![]() |
- |
3種類のオプションと使いどころ
ということで、三種類のオプションをどんな状況で使うべきか見ていきましょう。
1. --soft
--soft
を指定すると、無くしたコミットに含まれていた修正は全て保持されます。また、その修正はステージングに保持された状態になります。
使いどころ
-
直前のコミットメッセージを変更したい!
-
$ git reset --soft HEAD^
- HEAD^を指定することで、HEADのコミットをなかったことにする
- HEADで行った修正はステージングに残る(git add された状態)
-
-
直前にした二つのコミットを一つにまとめたい!
-
git reset --soft HEAD^^
- HEAD^^を指定することで、HEAD^とHEAD^^のコミットをなかったことにする
- HEAD^とHEAD^^で行った修正はステージングに残る(git add された状態)
-
2. --mixed
--mixed
を指定すると、無くしたコミットに含まれていた修正は全て保持されますが、--soft
と違いその修正はステージング状態にはなりません。
ちなみに、git reset
のデフォルト値は--mixed
です。
使いどころ
- コミットする気のないファイルをAddしてしまったので、git addをなかったことにしたい!
-
$ git reset --mixed HEAD
- HEADを指定することで、HEADのコミット以後に行われた修正(=まだコミットされてない修正)のステージング状態を解除する(=git add されていない状態にする)
-
3. --hard
--hard
を指定すると、無くしたコミットに含まれていた修正は全て削除されます。
使いどころ
-
修正が不要になったので、削除して元の状態に戻したい!
-
$ git reset --hard HEAD
- HEADを指定することで、HEADのコミット以後に行われた修正(=まだコミットされてない修正)を削除する
-
-
コミット済みの修正を削除して元の状態に戻したい!
-
$ git reset --hard HEAD^^
- HEAD^^を指定することで、HEAD^とHEAD^^のコミットをなかったことにする
- HEAD^とHEAD^^で行った修正は完全に削除される
-
おわりに
git resetは便利ですが、オプションを間違えると修正がなくなってしまう危険もあります。意味を理解して使うようにしましょう!
ここまでご覧いただきありがとうございました!
参考
https://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe
https://www.r-staffing.co.jp/engineer/entry/20191129_1