Git ツール

[Git] git reset に気をつけろ!!

ある日、日常の中で仕事を進めていました。
WEB開発業務はタスクの画面切り替えも頻繁におこなうものです。

ふとターミナルに切り替え、コマンドを確認しようかと上カーソルを押し、なぜか?ふわっとEnter。 ← ここが悲劇の始まり
ん?今 git resetって書いてた?まさかと確認すると、GitHubにプルリク(プルリクエスト)済のコミットでじゃあーりませんか!!

ガーン。

こんなケースありませんか?
一度プルリクに出したコミット群は触らぬが仏。もし、プルリク済みのコミットを取り消したい場合などはgit revertを使います。これは先日記事にしました。

[Git]git revertをすべき時、そして作業の流れ

続きを見る

で、ここからどうするか?次の一手を考えます。

とりあえず、ぐぐってみる・・。でも、ヒットするのは「git reset を元に戻す = とりま変更作業内容を復元」だけです。

 

ぐぬぬ・・。同じ言い回しになるんだけど、git reset --soft HEAD^ でファイル変更内容は保持しつつ、コミットだけを打ち消す、または、git reset自体をgit resetで取り消して作業内容の復元できるのはわかっておま。

わたくしは、コミット自体(コミットハッシュ)を元に戻したい。(結果、復元できるかわからんかった。テヘ)

 

git reflogコマンドでgit resetをしてしまったもの自体をリセットする

先ほどの話ですが、これはググると以外と出てきます。確かにgit refloggit resetした履歴も出ます(git logで確認できないGit操作履歴を確認できるのがgit reflog)。

実はこれ、git reset HEAD{番号}とかやってみても、ファイルの変更履歴は復活できます。ですが、コミットのハッシュ値は新たに作り変えられる模様。(なので、結果的にgit resetしたものはプッシュする時にリモートブランチものと整合性がとれなくなってしまい、git push origin ブランチ名 時にエラー or 警告が出る。git未熟練の人だと強引にプッシュしたい病になる。そう禁じ手のforceプッシュなのである。 ← これやったらあかんやつ。プルリクしたブランチがぶっこわれる)

ここで、詰んだので、次の一手で答えを出しました。

 

A. プルリクをクローズし、新たにプルリクを立て直す。

これが結果的に遠回りのようだけど、近道だと思います。(悟空かw)

でも、ここで実験してみたくなります。

Q. git reset --hard でもしかして、resetをしたこと自体を完全にresetできるのでゎ?

ならば、「元の戻す」という観点から考えれば、都合よくコミットハッシュを含め、復活させることができるのではないか?」と思ったのです。

やってみたことはない。でも、やれば現状の作業内容も全て破棄される・・(この時、リセットした作業内容以外にも作業したものがあった)

 

えい、やー(きんに君風)

 

結果: えーと、全部消えましたw

ということで、リポジトリ上のプルリクをクローズし、一旦、整合性のとれなくなったリモートブランチを削除。
その後、再度、作業変更したものをコミットしなおし(新規プルリクなので、コミットハッシュ値が変わっても何ら問題なくなった)、再度新たにプッシュとプルリクを作成することで、レビューしてもらえることになりました。(ブランチ名は連番などに変えておくのが吉です。レビュー側からすると、同じブランチ名でプッシュされると勘違い&事故を起こしやすいので)

コミットハッシュ自体が復活できるやつないかなあ・・(しってたら教えてください)

 

得た経験値: git resetは元に戻すといっても、コミットハッシュ値は元に戻ってくれない

git resetには気をつけよう。というお話でした。

-Git, ツール
-