Gitの「戻る」正しい使い方|reset –softと–hardの違いでChatGPTに翻弄された話

目次

あれ?戻らない…とりあえずブランチを変えていたが。

ファイルを編集して「やっぱり前の状態が良かったな」と思って、 いつもの感覚で 「戻る」を押してみたけど……戻らない。

「あれ?おかしいな?」

そう思って、とりあえず今の状態を壊したくなかったので、 別のブランチを切って切り替えるという方法でとりあえず戻った。

git switch -c feature/B   # 編集途中を別ブランチに分ける
git switch feature/A     # ひとつ前のコミットに戻る

これで目的の状態には戻れたんですが、 ふと思いました。

「このやり方って、正攻法なの?」

個人開発だからかGitの使い方が適当すぎて、いざ困ったときにあたふたするのは前回でも言ったとおり。そんな疑問が出てきたので、またChatGPTに聞いてみた。


ChatGPTの回答:–softで戻せ。

  1. あいうえお → コミット(A)
  2. かきくけこ → コミット(B)
  3. さしすせそ → 編集中(未コミット)

このとき、「さしすせそ」は間違っていたから、 **一つ前の『かきくけこ』まで戻したい!**という状況を想定する。


方法1:いったんコミットして --soft で戻す(安全)

git commit -m "さしすせそ"
git reset --soft HEAD~1

HEAD~1は「1つ前のコミット」って意味。
この操作をすると、次のような状態になります:


※以下はChatGPTのコメントそのまま載せてます(「かきくけこ」を残せって言っているのに、「あいうえお」を残してます)
さしすせそをコミットしていない状態で実行すると、かきくけこ ではなく あいうえお まで戻るので、おそらくそういう想定だろう。

コミット履歴:

A: あいうえお
(B: かきくけこ → 履歴からは消えるが、内容はステージ状態で残る)

ツリー構造で表すと、こうなります:

[あいうえお] ← HEAD(現在)
 ↑
 B(かきくけこ):ステージ状態で残る

そのまま修正して再度コミットすればOKです。 履歴を汚さず、安全に作業を続けられる方法です。


方法2:--hard で強制的に戻す(危険)

git reset --hard HEAD~1

この操作は、直前のコミット(かきくけこ)だけでなく、 作業中の内容(さしすせそ)もすべて消えてしまうという点で注意が必要です。

結果:

コミット履歴:

  • A: あいうえお

ツリー構造はこう:

[あいうえお] ← HEAD(現在)

ファイルの中身も履歴も完全に巻き戻されます。

⚠️ --hard は本当に「全部なかったことにしたい」ときだけ使うべきです。


試してみたけど –softで戻らない。

「かきくけこ」を残せって言っているのに、「あいうえお」を残したのはまあ・・・それは目をつぶって、
とりあえずわかったとChatGPTの情報を鵜呑みにして、だいたいはそこで終わるんだけど、
一応本当かどうか実証しておこうかと思って試してみた。

aaaaa と書いて「コミット:あいうえお」
bbbbb と追記して「コミット:かきくけこ」
ccccc と追記して「コミット:さしすせそ」

入力した結果、こうなっている。
左:Git Graph(VSCode拡張)で現在のコミット状態を確認
右:Cursorエディタで開いたテキストファイルの中身

git reset –soft HEAD~1を実行。

たしかにコミットは戻っているけど、文章が戻ってない。(cccccが残っている)


git reset –hard HEAD~1だと確かに戻った。

コミットも文章も戻っているようだ(cccccが消えている)

もう一度ChatGPTに聞いてみる。

git reset –soft HEAD~1で戻らないんだけど。

はい、それ、実は「正常な挙動」です。
--soft は「履歴だけを戻す」

git reset --soft HEAD~1 は、最後のコミットをなかったことにするだけで、
ファイルの中身(=ワークツリー)やステージ状態はそのまま残ります。

この辺がよくいう「プロンプト」の難しいところ

「かきくけこ」に戻れるんだよね?と試す前に念は押したんだけど、

「はい、そのとおりです。このケースでは、git reset –soft HEAD~1 を使えば「かきくけこ」の状態に戻れます!」

自信満々で回答しただけに、なかなか意図が伝わずに難しいところ。
それか、単純によく言われる「ChatGPTは回答がコロコロ変わる」という所なのか。
よく個人開発は「ChatGPT」よりも「Claude」のほうが名前はよく出てくるが、変な情もわいてきて「ChatGPT」+「Cursor(コードエディタ)」を現在は採用している。

結局、ブランチ変えたほうが楽かな?

その後も、「教えてほしいことはこういうことだった」とか、「他の方法とかないの?」とか小一時間くらい話したけど、結局内容など何も入ってこない。
色々ブランチ変えるのはいいのか悪いのか結局結論が出なかったけど、結局そのほうが失敗が少ないかと。
個人開発なのでまあ自分がわかればいいかと、思っている。


目次