Think Twice
IT技術メモ | Gitのメモ
Created: 2022-11-26 / Updated: 2022-11-26

Gitでコミットした後に好きな時点へ戻り、その時点からコミットした時点までをローカル変更した状態として復元する


ちょっと使いどころの難しいgit reset --mixedgit reset --softの使い道を紹介します。

目次


手順

1. コミット後、ひとまず作業用のブランチを作ります

作業用ブランチ名はworkとします。

Copy
$ git switch -c work

2. 次に戻りたい地点まで、resetコマンドで戻ります

戻りたい地点をxyzとします。

Copy
$ git reset --mixed xyz

単純にこれでもOK
Copy
$ git reset xyz

以上です。簡単でしょ?

補足説明

どういう状態か?

2の状態は「ローカル変更した状態」で「まだステージングしていない」状態となっています。
つまり、戻りたい地点でちょっとファイルを編集しただけの状態ということです。
この状態からの次のアクションとしては、コミットしたいファイルをaddしてステージし、その後コミットする感じです。

git merge --squashとの比較

ちなみに、ここで紹介しているやり方は、git merge --squashとだいたい同じです。
やった作業内容を失いたくないので、ひとまず一時的に作ったブランチにコミットを溜め込んでおいて、
最後にこの手法でコミットしたい場所まで戻って、差分を一つにまとめてコミットする、なんてことができますね。 git merge --squashの場合、コミットコメントをいい感じに寄せ集めてくれたりしますが、
ここで紹介しているやり方のほうが柔軟にaddし直せるので、便利かなと個人的には感じています。

なんで最初にworkブランチを作っているのか?

これは、元々コミットしていたブランチで作業してしまうと、そのブランチのHEAD位置がresetによって書き換えられてしまい、
元いた位置がわからなくなってしまうため、元いた位置(ブランチ)が消えないようにするために敢えてブランチを作ってから作業しているということです。

もしかすると、元のブランチを再利用したい人は、手順1でブランチを作るのではなく、タグでも付けておくという方法でもいいかもしれません。

1の手順はタグでも可
Copy
git tag old_commit_point

ステージングした状態で戻りたい場合

2の状態はステージングされていない状態ですので
仮に、「ステージングはした状態」として戻りたかった場合、以下のように--mixed--softに変えるだけです。

戻りたい地点をxyzとします。

Copy
$ git reset --soft xyz
あまりいい用例を思い浮かばないのですが、例えば 「コミットしたんだけど、コメントをミスったので、直前に戻ってコメントだけ修正して再コミットしたい場合」とかですかね。 いわゆるgit commit --amendで同じことができたりするものです。(xyzの部分はHEAD^になるかと思います。)


参考

関連メモ

参考サイト