ちょっと使いどころの難しいgit reset --mixed
やgit reset --soft
の使い道を紹介します。
目次
手順
1. コミット後、ひとまず作業用のブランチを作ります
作業用ブランチ名はwork
とします。
$ git switch -c work
2. 次に戻りたい地点まで、resetコマンドで戻ります
戻りたい地点をxyz
とします。
$ git reset --mixed xyz
- ここでのポイントは
--mixed
を指定することです。 reset
のデフォルトは--mixed
なので、特に指定しなくても良いですが、ここでは敢えて意識するため指定しています。
$ git reset xyz
以上です。簡単でしょ?
補足説明
どういう状態か?
2の状態は「ローカル変更した状態」で「まだステージングしていない」状態となっています。
つまり、戻りたい地点でちょっとファイルを編集しただけの状態ということです。
この状態からの次のアクションとしては、コミットしたいファイルをadd
してステージし、その後コミットする感じです。
git merge --squashとの比較
ちなみに、ここで紹介しているやり方は、git merge --squash
とだいたい同じです。
やった作業内容を失いたくないので、ひとまず一時的に作ったブランチにコミットを溜め込んでおいて、
最後にこの手法でコミットしたい場所まで戻って、差分を一つにまとめてコミットする、なんてことができますね。
git merge --squash
の場合、コミットコメントをいい感じに寄せ集めてくれたりしますが、
ここで紹介しているやり方のほうが柔軟にadd
し直せるので、便利かなと個人的には感じています。
なんで最初にworkブランチを作っているのか?
これは、元々コミットしていたブランチで作業してしまうと、そのブランチのHEAD
位置がreset
によって書き換えられてしまい、
元いた位置がわからなくなってしまうため、元いた位置(ブランチ)が消えないようにするために敢えてブランチを作ってから作業しているということです。
もしかすると、元のブランチを再利用したい人は、手順1でブランチを作るのではなく、タグでも付けておくという方法でもいいかもしれません。
git tag old_commit_point
ステージングした状態で戻りたい場合
2の状態はステージングされていない状態ですので
仮に、「ステージングはした状態」として戻りたかった場合、以下のように--mixed
を--soft
に変えるだけです。
戻りたい地点をxyz
とします。
$ git reset --soft xyz
git commit --amend
で同じことができたりするものです。(xyz
の部分はHEAD^
になるかと思います。)